导入父模块包

3 投票
2 回答
1170 浏览
提问于 2025-04-17 05:42

目录结构:

[app]
    start.py
        import package1
    [package1]
        __init__.py
            print('Init package1')
            import module1
            import subpackage1
        module1.py
            print('package1.module1')
            import package1 # this works OK
        [subpackage1]
            __init__.py
                print('Init package1.subpackage1')
                import module1
            module1.py
                print('Init package1.subpackage1.module1')
                #from package1 import subpackage1 # ImportError: cannot import name subpackage1
                #from .. import subpackage1 # ImportError: cannot import name subpackage1
                #import . as subpackage1 # SyntaxError: invalid syntax
                import package1.subpackage1 as subpackage1 # AttributeError: 'module' object has no attribute 'subpackage1'

为了避免在 subpackage1.module1 中出现循环导入的问题,我想导入模块 subpackage1,这样我就可以用 subpackage.module2 的形式来引用 subpackage1 中的其他模块。因为如果我用 from . import module2 的话,当我尝试导入时,module2 可能还不存在于 subpackage1 中。

我尝试了四种不同的方法,但都没有成功,具体情况可以查看代码中的评论。

有没有人能帮帮我?

之前 subpackage1 是顶级包,那时候一切都正常(可以看看 package1.module1 的源代码是怎么工作的)。现在,当我把它移动到下一级后,就出现了这个问题……我知道我可以把 package1 目录添加到 sys.path 中,但这样做看起来不太好。

2 个回答

1

我不太确定你想要做什么,但如果你使用绝对导入,并且避免在 __init__ 模块中放代码,你的例子可能会更容易理解。

试试这样做:

[app]
    start.py
        print('Start')
        from package1 import module1
    [package1]
        __init__.py
            print('Init: package1')
        module1.py
            print('Load: package1.module1')
            from package1.subpackage1 import module1
        [subpackage1]
            __init__.py
                print('Init: package1.subpackage1')
            module1.py
                print('Load: package1.subpackage1.module1')
                from package1 import subpackage1

运行 start.py 后,你应该会看到这样的输出:

Start
Init: package1
Load: package1.module1
Init: package1.subpackage1
Load: package1.subpackage1.module1
2

我用了这个小技巧,效果不错:

#import package1.subpackage1 as subpackage1 # AttributeError: 'module' object has no attribute 'subpackage1'
subpackage1 = sys.modules[__name__.rpartition('.')[0]] # parent module

或者你也可以试试这个:

from package1 import subpackage1

在某些情况下,这个方法也有效:https://stackoverflow.com/a/24968941/248296

撰写回答