在python中使用子进程打开多个cmd



我使用for循环打开多个cmd,在那里我可以在每个cmd中运行python脚本。

#test.py
import time
print("test.py started...)
time.sleep(1)
print(test.py finished...)
# test.py is same folder.
import subprocess
cmd_2 = "python test.py"
for i in range(3):
b = subprocess.Popen(["start", "/wait", "cmd.exe", "/k", cmd2], shell=True)
(output, err) = b.communicate()
print(output)
print(err)

主要问题是:代码在b.communicate()行等待,等待关闭cmd的当前实例(完全杀死cmd(。有没有什么方法可以让我们不必等待关闭/终止cmd,然后打开下一个cmd并运行python代码?

在启动下一个进程之前,不需要等待stdout被读取,您可以在一个循环中启动所有进程,然后在一个单独的循环中读取它们。并且还应该替换"/K〃;用"/C";使cmd在完成执行后关闭,而不是挂起等待您手动关闭它,如果您保留"/K〃;所有cmd面板都将保持打开状态,并且您将同时打开3个cmd窗口。

# test.py is same folder.
import subprocess
cmd_2 = "python test.py"
processes = []
for i in range(3):
processes.append(subprocess.Popen(["start", "/wait", "cmd.exe", "/C", cmd_2], shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE, text=True))
for i in range(3):
(output, err) = processes[i].communicate()
print("-----stdout----")
print(output)
print("-----stderr----")
print(err)

这将不打印任何内容,因为cmd.exe本身不会将输出返回到stdout。。。

那么,为什么要推出cmd.exe呢?您已经在传递shell=True,所以您可以通过cmd访问python.exe,并且您可以直接从中读取输出,如下所示。

import subprocess
cmd_2 = "python test.py"
processes = []
for i in range(3):
processes.append(subprocess.Popen(cmd_2, shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE, text=True))
for i in range(3):
(output, err) = processes[i].communicate()
print("-----stdout----")
print(output)
print("-----stderr----")
print(err)

最新更新