【发布时间】:2020-12-07 09:33:58
【问题描述】:
我目前正在尝试将多个相关包组合在一个父包 (meta_package) 中。在这样做的同时,我还希望其中一个包可以作为独立包安装。为此,我创建了以下文件夹结构:
├── meta_package
│ ├── subpackage1
│ │ ├── module.py
│ │ ├── __init__.py
│ ├── subpackage2
│ │ ├── module.py
│ │ └── __init__.py
│ ├── subpackage3
│ │ ├── module.py
│ │ └── __init__.py
│ └── installable_subpackage
│ ├── README.md
│ ├── __init__.py
│ ├── requirements.txt
│ ├── setup.py
│ ├── installable_subpackage
│ │ ├── __init__.py
│ │ └── submodule
│ │ ├── __init__.py
│ │ └── module.py
虽然上述结构达到了预期的效果,但无论是在将子包定义为namespace packages 还是普通包时,它都引入了一个额外的installable_subpackage 目录。因此,要从installable_subpackage 导入一个类,我必须使用以下导入语句:
from meta_package.installable_subpackage.installable_subpackage.submodule.module import Class
但是,我希望能够使用以下(更短的)导入语句来导入类:
from meta_package.installable_subpackage.submodule.module import Class
我已经尝试过的
使用名称空间包
我尝试将namespace packages 用于子包,而不是使用普通包。不过这并没有解决多余文件夹的问题,还引入了一些python import traps。
导入 installable_subpackage.init.py 文件中的冗余文件夹(模块)
我还尝试在installable_subpackage.__init__.py 文件中导入installable_subpackage 子模块:
import meta_package.installable_subpackage.installable_subpackage
但这似乎不起作用,因为meta_package.installable_subpackage.submodule 导入路径不指向meta_package.installable_subpackage.installable_subpackage.submodule 模块。我认为这是因为此方法仅适用于类而不适用于模块。
使用 setuptools 包和 package_dir 参数
最后,根据to this issue,我尝试在meta_package setup.py 中使用setuptools packages 和package_dir 参数摆脱多余的文件夹。为此,我使用了以下 setup.py:
from setuptools import setup, find_namespace_packages
setup(
name="meta_package",
...
packages=find_namespace_packages(include=["meta_package.*"]),
package_dir={"meta_package.installable_subpackage": "meta_package/installable_subpackage/installable_subpackage"},
)
然而,这似乎也没有摆脱多余的文件夹。
问题
我试图实现的包装结构是否可行?此外,如果是这样,是否鼓励或不建议使用它?
系统信息
- Python 版本:Python 3.8.5
- 虚拟环境:Conda
【问题讨论】:
-
当使用
package_dir时,您不能真正使用find_namespace_packages,您必须手动编写列表或在将其分配给packages之前对其进行修改。 -- 可能是这样的: stackoverflow.com/a/63141103/11138259 -
@sinoroc 非常感谢它解决了我的问题!这确实是对
find_namespace_packages方法和package_dir参数如何工作的误解。您是否还知道在我的用例中使用namespace包还是标准包更好?根据我目前的理解,命名空间包主要用于在不同文件夹中分发相关包,同时防止名称冲突 (stackoverflow.com/questions/21819649/…)。 -
@sinoroc 在阅读了python.developreference.com/article/25478339/… 之后,我现在认为使用命名空间包是有意义的。我想让用户有机会只安装小子模块而不必下载整个库。
标签: python namespaces setuptools packaging