如果命令是一个列表并包含'&&',则Popen失败或'||'

时间:2016-10-27 15:24:35

标签: python popen

我有一个运行linux命令的python脚本来检查文件是否存在:

>>> p = subprocess.Popen([ 'sudo', 'test', '-f', '/root/some_file', '&&', 'echo', 'True', '||', 'echo', 'False' ])

它产生错误:

>>> test: extra argument `&&'

如果将命令作为单个命令传递,则它会成功执行:

>>> p = subprocess.Popen('sudo test -f /root/some_file && echo True || echo False' ], shell=True)
>>> True

如果将命令作为列表传递,为什么会失败?

我必须同时使用&&和||检查根文件是否存在所以我无法将其转换为单独的命令链,如建议here

1 个答案:

答案 0 :(得分:3)

根据这个答案: Python: subprocess call with shell=False not working

当使用shell = True调用Popen时,你应该使用一个字符串。 当用shell = False调用Popen时,你应该使用一个列表。

使用'&&'和'||'只有当你使用shell = True时它才会起作用,因为它们需要shell。这意味着您只能使用字符串作为命令而不是列表来使用它。

如果您将命令作为列表,那么您可以执行以下操作:

" ".join(cmd_list)

https://docs.python.org/2/library/subprocess.html#frequently-used-arguments