Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 引用atexit中的其他模块_Python_Atexit - Fatal编程技术网

Python 引用atexit中的其他模块

Python 引用atexit中的其他模块,python,atexit,Python,Atexit,我有一个函数,负责在程序结束时终止子进程: 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 las

我有一个函数,负责在程序结束时终止子进程:

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
信号
模块在调用
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
)来说,风险较小)