关于python:使用带有参数的subprocess.call

Using subprocess.call with an argument

本问题已经有最佳答案,请猛点这里访问。

与此问题相关

原则上的问题是相同的,我有一个subprocess.system调用

1
2
3
4
...
EDITOR = os.environ.get('EDITOR', 'vim')
subprocess.call([EDITOR, tf.name])
...

其中EDITOR是环境$EDITOR变量,tf.name只是文件名。

然而,Sublime文本建议将$EDITOR设置为export EDITOR='subl -w',使我的呼叫看起来如下:

1
subprocess.call(['subl -w',"somefilename"])

它的失败是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
raceback (most recent call last):
  File"/usr/bin/note", line 65, in <module>
    storage["notes"][args.name] = writeNote(args.name, storage)
  File"/usr/bin/note", line 54, in writeNote
    subprocess.call([EDITOR, tf.name])
  File"/usr/lib/python3.5/subprocess.py", line 557, in call
    with Popen(*popenargs, **kwargs) as p:
  File"/usr/lib/python3.5/subprocess.py", line 947, in __init__
    restore_signals, start_new_session)
  File"/usr/lib/python3.5/subprocess.py", line 1541, in _execute_child
    raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: 'subl -w'

当然,应该是这样的

1
subprocess.call([subl","-w""somefilename"])

一个解决办法可能是

1
2
args = EDITOR.split("")
subprocess.call(args + ["somefilename"])

但我有点担心这样做,因为我不知道$EDITOR的目标是什么,这样做安全吗?

处理这个案子的正确方法是什么?


你可以使用shlex。它处理类似于unix shell的命令。例如:>>> shlex.split("folder\ editor" ) + ["somefilename"]['folder editor', 'somefilename']>>> shlex.split("editor -arg" ) + ["somefilename"]['editor', '-arg', 'somefilename']

因此,您应该能够直接做到:subprocess.call( shlex.split(EDITOR) + ["somefilename"] )