gpt4 book ai didi

python - 在 atexit 中引用其他模块

转载 作者:行者123 更新时间:2023-11-28 21:30:25 24 4
gpt4 key购买 nike

我有一个函数负责在程序结束时杀死一个子进程:

class MySingleton:
def __init__(self):
import atexit
atexit.register(self.stop)

def stop(self):
os.kill(self.sel_server_pid, signal.SIGTERM)

但是当调用这个函数时我收到一条错误消息:

Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/home/commando/Development/Diploma/streaminatr/stream/selenium_tests.py", line 66, in stop
os.kill(self.sel_server_pid, signal.SIGTERM)
AttributeError: 'NoneType' object has no attribute 'kill'

看起来 ossignal 模块在调用 atexit 之前被卸载了。重新导入它们可以解决问题,但这种行为对我来说似乎很奇怪 - 这些模块是在我注册我的处理程序之前导入的,那么为什么它们在我自己的退出处理程序运行之前就被卸载了?

最佳答案

对于在程序终止时销毁事物的顺序没有强有力的保证,因此最好确保 atexit 注册的函数是自包含的。例如,在您的情况下:

class MySingleton:
def __init__(self):
import atexit
atexit.register(self.stop)
self._dokill = os.kill
self._thesig = signal.SIGTERM

def stop(self):
self._dokill(self.sel_server_pid, self._thesig)

这比重新导入模块更可取(这可能会导致程序终止速度减慢甚至无休止的循环,尽管对于“系统提供的”模块,例如 os,这种风险较小)。

关于python - 在 atexit 中引用其他模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com