[英]Trapping and handling taskkill in Windows Python
我正在將pywin32-218用於Windows(Windows XP SP3)上的Python 2.6.6。
在我的Python應用程序中,我有第二個線程(除了主線程),它產生了一個子進程來運行另一個Windows可執行文件。
我的問題是,當主進程(python.exe)被殺死(例如,使用taskkill)時,我想終止子進程(calc.exe)並執行一些清除操作。
我嘗試了各種方法(atexit,signal和win32api.handleConsoleCtrl),但似乎沒有一個方法能夠捕獲taskkill信號。
我的代碼如下(test.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()
該應用程序使用啟動
python.exe test.py
然后,控制台顯示“ calc.exe正在運行”,然后運行Calculator應用程序,並使用Process Explorer,我可以看到calc.exe是python.exe的子進程。
然后我使用殺死了主要過程
taskkill /pid XXXX /f
(其中XXXX是python.exe的PID)
此后發生的情況是命令提示符返回而沒有進一步的輸出(即,沒有打印“ cleaning up”,“ handleSignal”或“ handleConsoleCtrl”),Calculator應用程序繼續運行,並且在Process Explorer中,不再運行python.exe運行中,但calc.exe已重新設置其父級。
Taskkill(通常)發送WM_CLOSE
。 如果你的應用僅僅是控制台,沒有窗戶,而你可以得到CTRL_CLOSE_EVENT
通過由設置處理器SetConsoleCtrlHandler
(發生,如果你的控制終端窗口被關閉),你不能接受裸WM_CLOSE
消息。
如果您必須堅持使用taskkill(而不是使用其他程序發送Ctrl-C ),則一種解決方案是設置上述處理程序,並確保您的應用程序具有自己的終端窗口(例如,通過使用start.exe "" <yourprog>
調用它)。 有關替代方法的詳細信息,請參見https://stackoverflow.com/a/23197789/4513656 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.