首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用atexit中的其他模块

引用atexit中的其他模块
EN

Stack Overflow用户
提问于 2010-04-04 02:11:48
回答 1查看 1.7K关注 0票数 4

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

代码语言:javascript
复制
class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)

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

然而,当调用此函数时,我收到一条错误消息:

代码语言:javascript
复制
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被调用之前就被卸载了。重新导入它们解决了这个问题,但这种行为对我来说似乎很奇怪--这些模块是在我注册我的处理程序之前导入的,那么为什么在我自己的退出处理程序运行之前就卸载它们呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-04 02:15:35

对于程序终止时销毁内容的顺序没有强有力的保证,因此最好确保atexit-registered函数是自包含的。例如,在你的例子中:

代码语言:javascript
复制
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,这种风险较小)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2572172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档