我的目标是使用几个不同的参数为每个Popen
进程调用主程序,每个参数都有自己的控制台窗口。但是,一旦遇到崩溃,它会关闭该控制台,我真的很想让它保持打开状态。
import subprocess
from subprocess import CREATE_NEW_CONSOLE
import time
for i in range(1, 5):
subprocess.Popen(["python", "main.py", str(i), str(i)], close_fds=False, creationflags=CREATE_NEW_CONSOLE)
time.sleep(3)
是否可以使用subprocess.Popen
创建新进程并让控制台保持打开以便我读取错误?
链接到subprocess docs。
答案 0 :(得分:2)
控制台窗口由conhost.exe(Win 7+)实例托管,该实例在没有附加进程时退出。所以你只需要将第二个python.exe进程附加到每个控制台并让它等待。这是一个简单的演示脚本,使服务员进程等待主进程(即工作进程的父进程):
import sys
# If started with a pid, wait for the associated process to exit.
if len(sys.argv) > 1:
import ctypes
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
SYNCHRONIZE = 0x00100000
pid = int(sys.argv[1])
hproc = kernel32.OpenProcess(SYNCHRONIZE, 0, pid)
if not hproc:
sys.exit(ctypes.get_last_error())
print('waiter: waiting')
kernel32.WaitForSingleObject(hproc, -1)
sys.exit(0)
import os
import subprocess
print('worker: start')
# The waiter waits on our parent (ppid).
p = subprocess.Popen([sys.executable, sys.argv[0], str(os.getppid())])
print('worker: exit')
例如:
>>> import sys, subprocess
>>> flags = subprocess.CREATE_NEW_CONSOLE
>>> p = subprocess.Popen([sys.executable, 'main.py'], creationflags=flags)
>>> p.wait()
0
>>> exit()
工作进程重新生成自己等待其父进程。然后退出时返回代码为0.控制台窗口在exit()
之后关闭。
您还可以从主进程生成服务器实例。在这种情况下,将工作人员的PID传递给服务员。然后服务员可以调用FreeConsole
和AttachConsole
将自己附加到工作人员的控制台。这更复杂,但主要过程很容易终止服务员。