我有一个程序需要在退出后进行一些清理,并为此编写了一个单独的 .py 文件。但是,我使用的程序在一个部分停留在无限循环中:
pythoncom.PumpMessages()
因此,程序没有“自然”关闭。唯一的方法是从任务管理器结束进程。
所以我问:有没有办法在从任务管理器结束后自动运行我的清理 python 脚本?
编辑:如果有帮助,我可以以不同的方式将其置于无限循环中,例如:
while True:
pythoncom.PumpWaitingMessages()
我的项目中有示例:
import signal
def term(*args,**kwargs):
sys.stderr.write('\nStopping...')
do_cleaning_stuff_here()
signal.signal(signal.SIGTERM, term)
signal.signal(signal.SIGINT, term)
signal.signal(signal.SIGQUIT, term)
yuor_main_code_here()
无限循环:
import signal
def term(*args,**kwargs):
global running
sys.stderr.write('\nStopping...')
running=False
signal.signal(signal.SIGTERM, term)
signal.signal(signal.SIGINT, term)
signal.signal(signal.SIGQUIT, term)
running=True
while running:
handle()
cleanup()
windows 信号转换为 unix 等价物。
您可以从单独的 python 脚本运行这两个脚本,并在运行第二个进程之前终止第一个进程。
例如使用 subprocess.Popen:
proc1 = subprocess.Popen(cmd, shell = True)
time.sleep(waititme) #or other flag, such as reading another source
proc1.kill()
proc2 = subprocess.Popen(cmd2, shell = True)
在 unix 中,当你杀死一个进程时,你会向它发送一个信号。例如,CTRL-C 导致向程序发送一个信号。
在 Windows 上,其中一些信号被模拟,包括 CTRL-C。如果您的循环没有调用阻止 CTRL-C 信号的函数,那么您可以按 CTRL-C 来终止循环。您可以尝试使用 CTRL-C 来终止程序,而不是通过任务管理器来终止程序吗?
如果它以这种方式工作,您可以编写一个处理程序来捕获 CTRL-C 信号,清理程序状态,然后sys.exit()
.
这是捕获信号的代码: 如何在 Python 中捕获 SIGINT?