python - 在 Python 中导入深度嵌套的模块
问题描述
考虑 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
我们要使用:
import basepackage.package.subpackage.module as 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]
人想使用:
from basepackage.package.subpackage import module as 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 . import subpackage
basepackage/package/subpackage/__init__.py
必须包含类似于from . import module
注意:__init__.py
文件中的 import 语句也可以是绝对路径而不是相对路径。
对于第二个选项(from basepackage.package.subpackage import module as aliased_module
),只要每个级别都有空__init__.py
文件就足够了,只要这些__init__.py
文件存在。
推荐阅读
- java - HQL 不会删除子(一对多)记录,但 ORM 删除会
- event-sourcing - 用于注册、登录、退出的事件采购
- rxjs - RxJS 鼠标活动跟踪
- java - 当代理关闭时,Kafka Streams 停止侦听主题并处理消息
- ms-access - 当后端为共享点列表时,与多个用户共享 ms 访问前端文件
- matlab - 在 MATLAB 中生成具有已知 PDF 表达式的随机变量
- reactjs - How to intercept message from Chatbot in a React component ? (Microsoft botframework-webchat)
- python - SSD和SSD Lite有什么区别??(Tensorflow)
- c - 矩阵的第一个索引被忽略
- python-3.x - 通过 EC2 进行 S3 身份验证,无需在代码或存储中传递 AWS 访问密钥和密钥