如何在Windows上崩溃后保持subprocess.Popen控制台打开?

时间:2015-11-11 08:53:44

标签: windows python-3.x console popen

我的目标是使用几个不同的参数为每个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

1 个答案:

答案 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传递给服务员。然后服务员可以调用FreeConsoleAttachConsole将自己附加到工作人员的控制台。这更复杂,但主要过程很容易终止服务员。