python - 在Python中导入深度嵌套的模块

标签 python import package python-import python-module

考虑 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/

相关文章:

python - 正在创建 InteractiveShellEmbed 的多个不兼容的子类实例

python - 我的日期时间格式不正确,我做错了什么?

Java 包导入别名

java - 在同一个包中导入一些类

Python - 如何将此模式(数字/数字)与正则表达式匹配?

Python - 编写一个在 + 和 - 之间交织的公式

vb.net - 从另一个文件调用类 ASP.NET VB.NET

import - 实现包图时使用<<access>>和<<import>>有什么区别?

android - 库存短信应用程序包名称是什么?

c# - C# 中的命名空间与 Java 和 Python 中的导入