运行 atexit() 当 python 进程被终止时
Run atexit() when python process is killed
我有一个 python 进程,它 运行 在后台运行,我希望它仅在脚本终止时生成一些输出。
def handle_exit():
print('\nAll files saved in ' + directory)
generate_output()
atexit.register(handle_exit)
调用引发 KeyboardInterupt
异常并且 sys.exit()
正确调用 handle_exit()
,但是如果我从终端执行 kill {PID}
它会终止脚本而不调用 handle_exit().
有没有办法终止在后台 运行ning 的进程,并且在终止之前仍然 运行 handle_exit()
?
尝试signal.signal。它允许捕获任何系统信号:
import signal
def handle_exit():
print('\nAll files saved in ' + directory)
generate_output()
atexit.register(handle_exit)
signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)
现在您可以kill {pid}
并且handle_exit
将被执行。
在 Windows 上调试 PyCharm 时启用信号:
- 在 PyCharm 内点击
Ctrl + Shift + A
以调出“查找操作...”菜单
- 搜索“注册表”并按回车键
- 找到密钥
kill.windows.processes.softly
并启用它(您可以开始输入“kill”,它将搜索密钥)
- 重启PyCharm
检查您的系统并查看正在调用哪个信号:
import signal
import time
def handle_signal(sig_id, frame):
sig = {x.value: x for x in signal.valid_signals()}.get(sig_id)
print(f'{sig.name}, {sig_id=}, {frame=}')
exit(-1)
for sig in signal.valid_signals():
print(f'{sig.value}: signal.{sig.name},')
signal.signal(sig, handle_signal)
time.sleep(30)
我有一个 python 进程,它 运行 在后台运行,我希望它仅在脚本终止时生成一些输出。
def handle_exit():
print('\nAll files saved in ' + directory)
generate_output()
atexit.register(handle_exit)
调用引发 KeyboardInterupt
异常并且 sys.exit()
正确调用 handle_exit()
,但是如果我从终端执行 kill {PID}
它会终止脚本而不调用 handle_exit().
有没有办法终止在后台 运行ning 的进程,并且在终止之前仍然 运行 handle_exit()
?
尝试signal.signal。它允许捕获任何系统信号:
import signal
def handle_exit():
print('\nAll files saved in ' + directory)
generate_output()
atexit.register(handle_exit)
signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)
现在您可以kill {pid}
并且handle_exit
将被执行。
在 Windows 上调试 PyCharm 时启用信号:
- 在 PyCharm 内点击
Ctrl + Shift + A
以调出“查找操作...”菜单 - 搜索“注册表”并按回车键
- 找到密钥
kill.windows.processes.softly
并启用它(您可以开始输入“kill”,它将搜索密钥) - 重启PyCharm
检查您的系统并查看正在调用哪个信号:
import signal
import time
def handle_signal(sig_id, frame):
sig = {x.value: x for x in signal.valid_signals()}.get(sig_id)
print(f'{sig.name}, {sig_id=}, {frame=}')
exit(-1)
for sig in signal.valid_signals():
print(f'{sig.value}: signal.{sig.name},')
signal.signal(sig, handle_signal)
time.sleep(30)