Windows Python中taskkill的捕获和处理

2024-09-30 12:26:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python2.6.6forwindows(在windowsxpsp3上)和pywin32-218。在

在Python应用程序中,我有第二个线程(主线程除外),它生成一个子进程来运行另一个Windows可执行文件。在

我的问题是当主进程(python.exe)被终止(例如使用taskkill),我想终止子进程(小算盘)做些清理工作。在

我尝试了各种方法(atexit、signal和win32api.手柄控制器)但似乎没有人能捕捉到任务终止信号。在

我的代码如下(测试.py)公司名称:

import sys
import os
import signal
import win32api
import atexit
import time
import threading
import subprocess

class SecondThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.secondProcess = None
    def run(self):
        secondCommand = ['C:\WINDOWS\system32\calc.exe']
        self.secondProcess = subprocess.Popen(secondCommand)
        print 'calc.exe running'
        self.secondProcess.wait()
        print 'calc.exe stopped'
        # do cleanup here
    def stop(self):
        if self.secondProcess and self.secondProcess.returncode == None:
            self.secondProcess.kill()

secondThread = SecondThread()

def main():
    secondThread.start()

def cleanup():
    print 'cleaning up'
    secondThread.stop()
    print 'cleaned up'

atexit.register(cleanup)

def handleSignal(signalNum, frame):
    print 'handleSignal'
    cleanup()
    sys.exit(0)

for signalNum in (signal.SIGINT, signal.SIGILL, signal.SIGABRT, signal.SIGFPE, signal.SIGSEGV, signal.SIGTERM):
    signal.signal(signalNum, handleSignal)

def handleConsoleCtrl(signalNum):
    print ('handleConsoleCtrl')
    cleanup()

win32api.SetConsoleCtrlHandler(handleConsoleCtrl, True)

main()

应用程序使用

^{pr2}$

然后控制台会打印“计算.exe运行”,然后计算器应用程序运行,使用Process Explorer,我可以看到计算.exe作为python.exe在

然后我用

taskkill /pid XXXX /f

(其中XXXX是python.exe)在

之后的情况是命令提示符返回而没有进一步的输出(即“cleaning up”、“handleSignal”或“handleConsoleCtrl”都不会打印),计算器应用程序继续运行,并且从Process Explorer,python.exe不再运行,但是计算.exe重新成为父母。在


Tags: importself应用程序signal进程defexecleanup
1条回答
网友
1楼 · 发布于 2024-09-30 12:26:41

Taskkill(通常)发送WM_CLOSE。如果您的应用程序只是控制台并且没有窗口,而您可以通过SetConsoleCtrlHandler设置的处理程序来获取CTRL_CLOSE_EVENT(如果控制终端窗口关闭,则会发生这种情况),则无法接收到空的WM_CLOSE消息。在

如果您必须坚持使用taskkill(而不是使用不同的program to send a Ctrl-C),一个解决方案是设置上述处理程序并确保应用程序有自己的终端窗口(例如,使用start.exe "" <yourprog>来调用它)。请参阅https://stackoverflow.com/a/23197789/4513656以了解替代方案的详细信息。在

相关问题 更多 >

    热门问题