考虑 Python 3.6 中的以下情况:
basepackage
|---__init__.py
|---package
|---__init__.py
|---subpackage
|---__init__.py
|---module.py
重要细节:在basepackage.package.__init__.py
中有:
from basepackage.package.subpackage.module import AClass as AliasedClass
现在,我们要在 basepackage.package.subpackage.module.py
中使用:
导入basepackage.package.subpackage.module作为aliased_module
[1]
结果是:
AttributeError: module 'basepackage' has no attribute 'package'
堆栈跟踪列出了以下罪魁祸首语句(按以下顺序):
from basepackage.package.subpackage.module import AClass as AliasedClass
import basepackage.package.subpackage.module as aliased_module
但如果不是[1]
,而是想使用:
从basepackage.package.subpackage导入模块作为aliased_module
[2]
然后一切正常。
[1]
与 [2]
有何不同,前者会导致错误,而后者不会?
最佳答案
要使第一个选项(import basepackage.package.subpackage.module as aliased_module
)起作用,必须满足以下条件:
basepackage/__init__.py
必须包含类似于from 的行。 import package
(名称package
必须在此basepackage/__init__.py
文件中定义)basepackage/package/__init__.py
必须包含类似于from 的行。导入子包
basepackage/package/subpackage/__init__.py
必须包含类似于from 的行。导入模块
注意:__init__.py
文件中的 import 语句也可以是绝对路径,而不是相对路径。
对于第二个选项(from basepackage.package.subpackage import module as aliased_module
),如果每个级别都有空的 __init__.py
文件就足够了,如下所示只要这些 __init__.py
文件存在。
关于python - 在Python中导入深度嵌套的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57772706/