如何使用 python setuptools 将多个单个模块打包为子包

How to package multiple single modules as sub-package with python setuptools

我的目录结构如下所示。

pkg-folder
├── LICENSE
├── pkg-name
│   ├── __init__.py
│   ├── module1
│   │   ├── module1.py
│   │   ├── __init__.py
│   │   └── resourceFile.json
│   └── module2
│       ├── __init__.py
│       └── module2.py
├── README.md
├── setup.py
├── MANIFEST.ini
└── setup.cfg

构建并安装包后,我必须按如下方式导入。

from pkg-name.module1.module1 import func1

当我知道 module1.py 将是子包中的单个文件时,如何直接像下面这样导入?

from pkg-name.module1 import func1

我的__init__.py's是空白的。

您已经部分回答了自己的问题:

My __init__.py's are blank.

导入包时,解释器会检查包的 __init__.py 文件中的名称绑定。 empty __init__.py 文件只为同一目录中的子模块提供名称绑定。例如,如果你有一个像

这样的包结构
pkg_folder
└── pkg_name
    └── __init__.py

__init__.py 包含一些定义,如 x = 2,然后将 pkg_folder 作为当前工作目录或安装到 Python 环境的包,您可以导入x 使用

from pkg_name import x

但是,如果 x 定义在 submodule 中,情况就有些不同了。考虑以下包结构:

pkg_folder
└── pkg_name
    ├── __init__.py
    └── module1.py

这里,import pkg_name 再次告诉解释器检查 pkg_name/__init__.py 的名称绑定。如果定义 x = 2module1.py 而不是 __init__.py 中,那么它不属于 pkg_name 的范围;相反,它属于 pkg_name.module1,因此以下内容有效:

from pkg_name.module1 import x

但是,您可以通过在 __init__.py 中使用 package relative import 为它定义一个名称绑定来明确地将它添加到 pkg_name。在这种情况下,__init__.py 可能会显示为:

from .module1 import x

其中,由于 x 现在在 __init__.py 中定义,因此我们也可以在 pkg_name 下引用它:

from pkg_name import x

相同的逻辑适用于 sub-packages 中的模块。因此,对于您正在寻找的行为,您需要使用 sub-package.[=46= 中其他模块的包相关导入来填充 sub-package 的 __init__.py 文件]

去往

from pkg_name.module1.module1 import func1

from pkg_name.module1 import func1

您的 pkg_name/module1/__init__.py 文件可能类似于以下内容:

from .module1 import func1

如果有理由,您甚至可以扩展它以将 func1 传播到父包。