【问题标题】:imported modules becomes None when replacing current module in sys.modules using a class object使用类对象替换 sys.modules 中的当前模块时,导入的模块变为 None
【发布时间】:2015-03-17 18:56:30
【问题描述】:

在模块属性上启用__getattr__ 使用的不受欢迎但“受支持”的python hack(请参阅Guido:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html)涉及以下内容:

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 中,原始模块中的所有其他导入模块都设置为无。

>>> 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__]      

【问题讨论】:

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


    【解决方案1】:

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

    如果您需要支持 3.4 之前的 Python,解决方法是在将替换模块的类中使用 import 语句:

    class MyClass(object):
    
        import os
    
        def check_os(self):
            print(os)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2011-05-25
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      相关资源
      最近更新 更多