23

我有一个在后台运行的 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()。

有没有办法终止在后台运行的进程,并且在终止之前仍然运行它handle_exit()

4

3 回答 3

32

试试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将被处决。

于 2016-11-29T13:19:12.410 回答
1

在 Windows 上调试 PyCharm 时启用信号:

  1. 在 PyCharm 中点击Ctrl + Shift + A以调出“查找操作...”菜单
  2. 搜索“注册表”并回车
  3. 找到密钥kill.windows.processes.softly并启用它(您可以开始输入“kill”,它会搜索密钥)
  4. 重启 PyCharm
于 2021-01-11T17:01:49.350 回答
0

要检查您的系统并查看正在调用哪个信号:

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)
于 2021-01-11T17:46:25.143 回答