1

我有一个程序需要在退出后进行一些清理,并为此编写了一个单独的 .py 文件。但是,我使用的程序在一个部分停留在无限循环中:

pythoncom.PumpMessages()

因此,程序没有“自然”关闭。唯一的方法是从任务管理器结束进程。

所以我问:有没有办法在从任务管理器结束后自动运行我的清理 python 脚本?

编辑:如果有帮助,我可以以不同的方式将其置于无限循环中,例如:

while True:
    pythoncom.PumpWaitingMessages()
4

3 回答 3

3

我的项目中有示例:

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 等价物。

于 2013-07-27T17:43:55.297 回答
3

您可以从单独的 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)
于 2013-07-27T17:46:22.310 回答
1

在 unix 中,当你杀死一个进程时,你会向它发送一个信号。例如,CTRL-C 导致向程序发送一个信号。

在 Windows 上,其中一些信号被模拟,包括 CTRL-C。如果您的循环没有调用阻止 CTRL-C 信号的函数,那么您可以按 CTRL-C 来终止循环。您可以尝试使用 CTRL-C 来终止程序,而不是通过任务管理器来终止程序吗?

如果它以这种方式工作,您可以编写一个处理程序来捕获 CTRL-C 信号,清理程序状态,然后sys.exit().

这是捕获信号的代码: 如何在 Python 中捕获 SIGINT?

于 2013-07-27T17:42:19.390 回答