使用带有参数的 subprocess.call [重复]

Posted

技术标签:

【中文标题】使用带有参数的 subprocess.call [重复]【英文标题】:Using subprocess.call with an argument [duplicate] 【发布时间】:2016-09-03 09:34:42 【问题描述】:

与this question相关

原理上的问题是一样的,我有一个subprocess.system调用

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

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

但是,sublime text 建议将 $EDITOR 设置为 export EDITOR='subl -w' 让我的通话看起来像这样:

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

它会像这样失败:

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'

当然,它应该看起来像这样

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

一种解决方法可能是

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

但我对此有点谨慎,因为我不知道$EDITOR 设置为什么,这样做安全吗?

处理这种情况的正确方法是什么?

【问题讨论】:

@andlrc 不,不是重复的,这不是我的问题。我知道如何访问环境变量 【参考方案1】:

您可以使用 shlex。它处理 UNIX shell 之类的命令。 例如:&gt;&gt;&gt; shlex.split( "folder\ editor" ) + ["somefilename"]['folder editor', 'somefilename']&gt;&gt;&gt; shlex.split( "editor -arg" ) + ["somefilename"]['editor', '-arg', 'somefilename']

所以你应该可以直接这样做:subprocess.call( shlex.split(EDITOR) + ["somefilename"] )

【讨论】:

以上是关于使用带有参数的 subprocess.call [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将更多/多个参数传递给 Python subprocess.call [重复]

subprocess.call 路径问题,如何解决?

subprocess 模块

subprocess.call() 如何与 shell=False 一起工作?

Python subprocess.call 一个 bash 别名

subprocess.call 使用