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

标签 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 .

最佳答案

控制台窗口由 ​​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/

相关文章:

python - 一个类(class)中的一个类(class),这是固定的还是故意的?

python - 使用控制台启动程序时无法写入文件

linux - 如何在 Ubuntu 或 Debian 上设置物理硬件终端?

尽管 Eclipse 和 SDK 管理器在 Vista 上以管理员身份运行,但 Android-SDK 包安装错误

c++ - 子进程的标准输出/标准错误文件为空,FILE_FLAG_NO_BUFFERING 不工作

Android 手机未检测到在我的笔记本电脑上创建的无线网络

python - 如何将 python 脚本放在路径上?

Django - get_current_site(request) 只是抓取 example.com

c# - 重定向 cmd.exe 的输入和输出

windows - Windows 应用程序中的鼠标指针状态在鼠标移动之前不会改变