题
我有一个功能,是负责杀死子进程在程序结束时:
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'
像os
和signal
模块外貌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
较小)。
不隶属于 StackOverflow