Python subprocess.Popen 用于多个 python 脚本

Posted

技术标签:

【中文标题】Python subprocess.Popen 用于多个 python 脚本【英文标题】:Python subprocess.Popen for multiple python scripts 【发布时间】:2020-05-28 15:40:24 【问题描述】:

我正在尝试理解 Popen 方法。我目前在同一目录中有三个 python 文件:test.py、hello.py 和 bye.py。 test.py 是包含 subprocess.Popen 方法的文件,而 hello 和 bye 是简单的 hello world 和 goodbye world 文件,即它们只包含一个打印。

如果我这样做:

import subprocess
from subprocess import PIPE

tst = subprocess.Popen(["python", "hello.py"], stdout=PIPE, stderr=PIPE)
(out,err) = tst.communicate()

似乎一切正常,在 shell 中为 hello.py 获取正确的“Hello World”打印,并为 bye.py 执行相同的操作,shell 打印“GoodBye World”。

当我想运行这两个文件时,问题就开始了,

import subprocess
from subprocess import PIPE

tst = subprocess.Popen(["python", "hello.py", "python", "bye.py"], stdout=PIPE, stderr=PIPE)
(out,err) = tst.communicate()

这只会返回第一个 .py 文件的打印,然后返回

[WinError 2 ] The system cannot find the file specified

如果我还删除第二个“python”,就会发生这种情况。为什么会这样?

【问题讨论】:

如果你知道一个作品为什么不把它分成两个连续的电话? 如果你真的想同时调用两个"python",你可以尝试在第二个"python"之前添加一个分号。 【参考方案1】:

如果我还删除第二个“python”,就会发生这种情况。为什么会这样?

跑步

subprocess.Popen(["python", "hello.py", "python", "bye.py"]

类似于跑步

$ python hello.py python bye.py

这并没有多大意义,因为这被解释为将参数 hello.py python bye.py 传递给 python

这是第 1 部分,针对您的问题“我正在尝试理解 Popen 方法。”

在不知道你真正想用这个概念证明做什么的情况下,你有几个选择;依次调用多个Popen(),或使用分号和shell=True,但请务必考虑其中的security implications:

# This will also break on Windows
>>> import subprocess as sp
>>> sp.check_output("python -V ; python -V", shell=True)
b'Python 3.8.2\nPython 3.8.2\n'

【讨论】:

以上是关于Python subprocess.Popen 用于多个 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

python subprocess.popen stdin.write

python subprocess.Popen

Python subprocess.Popen PIPE和SIGPIPE

查找 subprocess.Popen python 的执行时间

杀死使用 Python 的 subprocess.Popen() 创建的进程 [重复]

Python subprocess.Popen 用于多个 python 脚本