我正在尝试使用下面的代码将旧模块实现指向一个新模块,但是在导入模块时我得到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
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语句的字节码。