首页 > 解决方案 > python中的多层包

问题描述

我有一个 python 包,里面有包。这个解释看起来很奇怪,所以我将包含我的包的结构:

package\_
    __init__.py
    subpackage1\_
        __init__.py
        file1.py
    subpackage2\_
        __init__.py
        file2.py

(我正在简化它以便于理解)。

__init__.py顶层看起来像这样:

__all__ = ["subpackage1", "subpackage2"]

而且,由于某种原因,在导入包时,它无法识别来自file1.pyor的任何内容file2.py。任何想法如何解决它?

如果您需要更多详细信息,请查看 github 上的项目:https ://github.com/Retr0MrWave/mathModule 。我调用的目录packagemathmodule_pkg实际项目中

标签: pythonpython-importpython-packaging

解决方案


用名称填充该__all__字段不会使导入成为可能,它只是作为您要导入的意思的提示。这个提示被 star-imports 接收来限制导入的内容,像 pycharm 这样的 IDE 也使用它来了解什么是公开的和不公开的 - 仅此而已。

如果要启用嵌套类和函数的顶级导入,则需要

  1. 将它们导入顶层__init__.py
  2. 将它们绑定到可用于导入的名称
  3. 可选地,引用所述名称__all__以使 API 美观且明显

以您引用的项目为例,它看起来像这样:

数学模块_pkg/__init__.py

import mathmodule_pkg.calculus.DerrivativeAndIntegral  #1

integral = mathmodule_pkg.calculus.DerrivativeAndIntegral.integral  #2

__all__ = ['integral']  # 3

使用非常常见的形式,from some.package import some_name我们可以将第 1 步和第 2 步结合起来,并减少重新绑定名称时出现错误的可能性:

from mathmodule_pkg.calculus.DerrivativeAndIntegral import integral  # 1 and 2

__all__ = ['integral']  # 3

使用任何一种形式,在安装你的包后,以下是可能的:

>>> from mathmodule_pkg import integral
>>> integral(...)  

推荐阅读