从 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
选项,这无论如何都是一个好主意,因为它占用的资源更少,并且可以避免您遇到的陷阱。
我有一个 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
选项,这无论如何都是一个好主意,因为它占用的资源更少,并且可以避免您遇到的陷阱。