如何使用 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 = 2
在 module1.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
传播到父包。
我的目录结构如下所示。
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 = 2
在 module1.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
传播到父包。