运行 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 时启用信号:

  1. 在 PyCharm 内点击 Ctrl + Shift + A 以调出“查找操作...”菜单
  2. 搜索“注册表”并按回车键
  3. 找到密钥 kill.windows.processes.softly 并启用它(您可以开始输入“kill”,它将搜索密钥)
  4. 重启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)