导入父模块包
目录结构:
[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