gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:49:28 26 4
gpt4 key购买 nike

我的目标是为每个 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 .

最佳答案

控制台窗口由 ​​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() 后关闭。

您还可以从主进程生成服务员实例。在这种情况下,将 worker 的 PID 传递给服务员。然后服务员可以调用FreeConsoleAttachConsole将自己附加到工作人员的控制台。这更复杂,但它使主进程很容易终止服务员。

关于windows - 在 Windows 上崩溃后如何保持 subprocess.Popen 控制台打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33647048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com