【问题标题】:subprocess.call requiring all parameters to be separated by commassubprocess.call 要求所有参数用逗号分隔
【发布时间】:2010-11-04 04:54:00
【问题描述】:

我曾经能够做一个subprocess.call(["command","-option value -option value"]) 并且它会工作有一个更改命令以正常处理引号中的内容,但现在我必须将我的子进程调用命令更改为如下所示:

subprocess.call(["command","-option","value","-option","value"])

我可以做些什么让它在 python 中以另一种方式再次工作?

os.system("command -option value -option value") 的工作方式与以前相同。

【问题讨论】:

    标签: python


    【解决方案1】:

    如果可以,请避免使用shell=True——它是security risk。为此,shlex.split 就足够了:

    import subprocess
    import shlex
    subprocess.call(shlex.split("command -option value -option value"))
    

    【讨论】:

    • 这个比上面那个好吗?使用 shelex 有什么好处?
    • shlex.split 基本上会为您创建一个列表。所以它几乎等同于subprocess.call(["command","-option","value","-option","value"]),而无需显式编写列表文字。
    • @Dag:它可以让你避免使用shell=True,这是一个安全风险。
    • 为什么不直接使用"command -option value -option value".split(" ")
    • @Tom: shlex.splitstr.split 更容易正确拆分命令行字符串。例如,shlex.split("command 'filename with spaces'") 正确返回 ['command', 'filename with spaces'],而 "command 'filename with spaces'".split() 错误返回 ['command', "'filename", 'with', "spaces'"]
    【解决方案2】:

    您需要指定 shell=True 以获取 subprocess.call 来解释字符串。

    参见subprocess.Popen constructor documentation 中的注释(subprocess.call 方法采用与 subprocess.Popen 构造函数相同的参数)。

    【讨论】:

    • 好的,所以我这样做了: subprocess.call("command "+"-option value -option value", shell=True) 并且它有效。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多