导入父模块包

时间:2011-11-05 17:46:06

标签: python import python-3.x

目录结构:

[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,以便从subpackage1格式subpackage.module2引用其他模块。因为如果我执行from . import module2,当我尝试导入时module2subpackage1的引用可能尚不存在。

我尝试了4种不同的方法 - 没有一种方法有效 - 请参阅代码中的注释。

任何帮助?

前段时间subpackage1是最高级别的套餐,它有效(看看它如何在package1.module1的来源中运作。现在,当我将它向下移动一级时 - 我有这个问题......我知道我可以将package1目录添加到sys.path,但这很难看。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我使用了这个对我有用的黑客:

#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