从 python script/shell 通过 popen 执行 python 模块

Executing python module through popen from a python script/shell

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

python3 -m moduleName args

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

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

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

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

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

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

谢谢!

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

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

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

解决方法是

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