1

我有一个由以下命令执行的 python 模块:

python3 -m moduleName args

尝试使用 subprocess.popen 从脚本执行它。

subprocess.Popen(command, shell=True, text=True, stdout=subprocess.PIPE)

根据子流程文档,我们建议传递一个序列而不是字符串。因此,当我尝试将以下命令作为参数传递时

command = ['python3','-m','moduleName','args']

我最终得到了一个 python shell 而不是正在执行的模块。如果我将它作为字符串传递,则事情会按预期工作。我找不到这方面的文档或参考资料。

有人可以帮助阐明这种行为吗?完成这项工作的最佳方法是什么?

谢谢!

4

1 回答 1

2

此行为是由shell=True选项引起的。在Popenshell 模式下运行时(在 POSIX 下),该命令会在“-c”选项之后附加到 shell 命令(subprocess.py, Python 3.9):

args = [unix_shell, "-c"] + args

当参数列表被扩展时,'-c' 之后的第一个参数(在你的例子中是'python3')被视为'-c' 的参数。其他参数被解释为unix_shell命令的进一步参数。例如-m,在 bash 中激活作业控制,如bash 手册中所述

解决方案是

  • 像您一样将命令作为单个字符串传递,或者
  • 不要为 设置shell选项Popen,这无论如何都是一个好主意,因为它占用的资源更少,并且可以避免像您遇到的那样的陷阱。
于 2021-10-12T19:56:29.443 回答