使用类对象替换sys.modules中的当前模块时,导入的模块将变为None

时间:2015-03-17 18:56:30

标签: python python-2.7 python-3.x python-import

不受欢迎但支持" 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()

导入时,导入的模块成为类实例:

>>> import myModule
>>> myModule
<myModule.MyClass object at 0xf76def2c>

但是,在Python-2.7中,原始模块中的所有其他导入模块都设置为None。

>>> repro.check_os()
None

在Python-3.4中,一切正常:

>>> repro.check_os()
<module 'os' from '/python/3.4.1/lib/python3.4/os.py'>

这感觉与Imported modules become None when running a function有关,但是,有人知道为什么会在内部发生这种情况吗?

似乎如果你存储原始模块(没有在Python-2中完全替换它),那么一切都会继续工作:

sys.modules[__name__+'_bak'] = sys.modules[__name__]      

1 个答案:

答案 0 :(得分:7)

你遇到的问题是在3.4之前的Pythons中,当一个模块被销毁时(因为你用一个类替换它并且没有进一步的引用),该模块中的项目为{{ 1}}被强制设置为__dict__

解决方法,如果你需要在3.4之前支持Pythons,那么在类中会有一个None语句来代替模块:

import

有关详细信息,请参阅this answer about interpreter shutdown