Python 临时目录在退出时没有被清理

我的主要代码是这样:

def main():
    with tempfile.TemporaryDirectory() as d:
        write_tmp_files(d)

即便是程序在终端被 ^C 终止,临时文件夹也会被正常清理,但是我发现 SIGHUP 到来时,临时文件夹就不会被正常清理了。可以注册一个信号处理器函数:

import signal
import sys

signal.signal(signal.SIGHUP, lambda signum, frame: sys.exit(0)) # 其实应该改成信号值 + 128

这样在 SIGHUP 到来时,临时目录也会被正常清理。

经过更多尝试,我发现 Python 只处理了 SIGINT 这一种情况,对于 SIGQUIT 等信号处理器也都没有处理。在收到 SIGINT 信号时能正常清理资源我猜测是 Python 对 SIGINT 有特殊处理(转换成 KeyboardInterrupt)。

为了在收到信号而终止时正常退出,最好是为每个会杀死程序的信号(除了 SIGKILL)注册信号处理器函数。最常见的信号可能是:

  1. SIGINT:在终端终止程序。
  2. SIGKILL 和 SIGTERM:由用户使用 kill(1) 产生。
  3. SIGHUP:用户关闭了终端。

除了 SIGKILL 实在没办法处理,其他几个处理了也就够了。保险点可以把以上之外的信号处理也注册了。