【问题标题】:Popen fails if command is a list and contains '&&' or '||'如果 command 是一个列表并且包含 '&&' 或 '||',则 Popen 失败
【发布时间】:2017-03-10 08:53:02
【问题描述】:

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

>>> 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

【问题讨论】:

  • 是的,它很相似。但我的主要音乐会是同时使用 && 和 ||检查根文件是否存在,因此我无法将其转换为单独的命令链

标签: python popen


【解决方案1】:

根据这个答案: 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

【讨论】:

  • 不,实际上并没有。它打印出类似帮助消息:`>>> 用法:sudo [-D level] -h | -K | -k | -V'
  • 你说得对,我刚试过。我会看看我能不能弄清楚这里发生了什么......
猜你喜欢
  • 2011-02-12
  • 2020-02-13
  • 2014-09-11
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
相关资源
最近更新 更多