目录结构:
[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
,当我尝试导入时module2
中subpackage1
的引用可能尚不存在。
我尝试了4种不同的方法 - 没有一种方法有效 - 请参阅代码中的注释。
任何帮助?
前段时间subpackage1
是最高级别的套餐,它有效(看看它如何在package1.module1
的来源中运作。现在,当我将它向下移动一级时 - 我有这个问题......我知道我可以将package1目录添加到sys.path
,但这很难看。
答案 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