CPython有一个奇怪的行为,它在关机期间将模块设置为None.在我写完的一些多线程代码关闭期间,这会搞砸错误记录.
我找不到任何有关此行为的文档.它在PEP 432中提到:
[...]显着减少将遇到"模块全局设置为无"行为的模块数量,该行为用于审议中断周期并尝试干净地释放更多外部资源.
有SO有关此问题的提问和C API文档中提到的嵌入式翻译关闭行为.
我还在python-dev和相关的CPython bug 上找到了一个相关的线程:
一旦解除分配,此修补程序不会更改模块对象清除其全局字典的行为.
这种行为记录在哪里?是Python 2具体吗?
一个不受欢迎但"支持"的python hack(参见Guido:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html),它允许__getattr__在模块属性上使用涉及以下内容:
import os, sys
class MyClass(object):
def check_os(self):
print os
sys.modules[__name__] = MyClass()
Run Code Online (Sandbox Code Playgroud)
导入时,导入的模块成为类实例:
>>> import myModule
>>> myModule
<myModule.MyClass object at 0xf76def2c>
Run Code Online (Sandbox Code Playgroud)
但是,在Python-2.7中,原始模块中的所有其他导入模块都设置为None.
>>> repro.check_os()
None
Run Code Online (Sandbox Code Playgroud)
在Python-3.4中,一切正常:
>>> repro.check_os()
<module 'os' from '/python/3.4.1/lib/python3.4/os.py'>
Run Code Online (Sandbox Code Playgroud)
这感觉与导入的模块有关,在运行函数时变为无,但是,任何人都知道为什么这会在内部发生?
看来如果你存储原始模块(没有在Python-2中完全替换它),那么一切都继续工作:
sys.modules[__name__+'_bak'] = sys.modules[__name__]
Run Code Online (Sandbox Code Playgroud)