首页 > 解决方案 > 在 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]

标签: pythonimportpackagepython-importpython-module

解决方案


要使第一个选项 ( 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文件存在。


推荐阅读