我有一个运行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
答案 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