在__init__.py中将一个模块重新指向另一个模块

时间:2015-11-17 15:15:26

标签: python import module

我正在尝试使用下面的代码将旧模块实现指向一个新模块,但是在导入模块时我得到AttributeError / ImportError。知道如何解决这个问题吗?为什么oldpack.sub.mymodule不可见,即使它在sys.modules中?

/oldpack/sub/__init__.py
    import sys
    import newpack.sub.mymodule
    sys.modules['oldpack.sub.mymodule'] = sys.modules['newpack.sub.mymodule']


/somepack/app.py
    from oldpack.sub.mymodule import some_func, SomeClass # works fine: we got some_func and SomeClass from newpack.sub.mymodule
    import oldpack.sub.mymodule # raises AttributeError: 'module' object has no attribute 'mymodule'
    from oldpack.sub import mymodule # raises ImportError: cannot import name mymodule

PS我想避免修改oldpack.sub.mymodule,以便将其更新为 来自newpack.sub.mymodule import *并不理想。

解决 我已经修复了错误。加载模块时会发生两件事情,模块会被添加到sys.modules中,模块会作为属性添加到父包中(请参阅import.c中的add_submodule)。因此,为了照顾后者,我更新了/oldpack/sub/__init__.py

中的第2行
    import sys
    from newpack.sub import mymodule # by importing this way, we simulate the adding of the module as attribute to the parent package
    sys.modules['oldpack.sub.mymodule'] = mymodule

/somepack/app.py中的第二次和第三次导入无法提前运行,因为它们依赖于模块在包中作为属性可用。有关详细信息,请使用dis.dis()查看这两个import语句的字节码。

0 个答案:

没有答案