将一个模块重新发布到\uu init \uuuuy.py中的另一个模块

2024-04-26 10:33:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用下面的代码将一个旧的模块实现指向一个新的模块实现,但是当模块本身被导入时,我得到AttributeError/ImportError。你知道怎么解决吗?为什么呢oldpack.sub.mymodule模块即使在里面也看不见系统模块?你知道吗

/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.c中的add\ u 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公司(). 你知道吗


Tags: 模块thefrompyimportmodulesinit系统