python - 具有独立依赖关系的 Python 命名空间
问题描述
我有一个大型项目,我想将其拆分为单独的可安装包。我们目前的布局是:
├── MANIFEST.in
├── readme.md
├── package
| ├── __int__.py
│ ├── a
│ │ ├── __init__.py
│ │ └── a.py
│ ├── b
│ │ ├── __init__.py
│ │ └── b.py
│ └── c
│ ├── __init__.py
│ ├── resources
│ │ └── log.png
│ └── c.py
└── setup.py
在这种情况下,我们有 package.c 依赖于 package.b,而 package.b 依赖于 package.a。package.a 使用“toml”,package.b 使用“wxPython”,package.c 使用“numpy”,还有其他依赖项。
现在,package.a 是最常用的包,我试图将它们分开,以便用户只能安装 package.a,并避免安装 package.b 和 package.c 的开销,除非他们需要它们提供的功能包。
现在,在setup.py
顶层,我们有:
#!/usr/bin/env python3
from setuptools import setup, find_packages
VERSION = '1.0.0'
REQUIRED_PACKAGES = ['toml', 'wxPython', 'numpy']
setup(
name='user_package',
description="User utilities",
version=VERSION,
packages=find_packages(),
include_package_data=True,
author='User',
author_email='user@user.com',
install_requires=REQUIRED_PACKAGES
)
我正在尝试将其移至名称空间包。为此,我删除了package/__init__.py
并更新了setup.py
:
from setuptools import setup, find_namespace_packages
VERSION = '1.0.0'
REQUIRED_PACKAGES = ['toml']
setup(
name='package-a',
description="User utilities",
version=VERSION,
packages=find_namespace_packages(include=['package.a']),
include_package_data=True,
author='User',
author_email='user@user.com',
install_requires=REQUIRED_PACKAGES
)
这将 package.a 单独且很好地打包。所以我虽然可以setup
多次调用,每个包一个,每个包都有自己的依赖项列表:
for i in ['a', 'b', 'c']:
setup(
name=f'package-{i}',
...
packages=find_namespace_packages(include=[f'package.{i}']),
...
install_requires=REQUIRED_PACKAGES[i] # Where REQUIRED_PACKAGES is a dict() of str:list
)
但这在随后的 setup 调用中失败。
而且我仍然无法弄清楚如何根据'package.c'来描述'package.c',尽管我怀疑如果我将'package-b'添加到install_requires
列表中,它会做到这一点。
也许这是我对如何生成轮子并通过 PyPi 提供单独的包的误解。
所以,我想这可以归结为两个问题:
- 我是否只生成一个轮子,将其上传到我们的 PyPi 镜像,然后它们可以单独安装?还是我需要生成 3 个单独的轮子,每个包一个,然后分别上传?
- 如何分离每个包的依赖项,以便安装 package.a 不会引入 package.c 的依赖项?
解决方案
推荐阅读
- javascript - 使用滚动从 div 内部展开 div 全屏
- c# - 如何在 C# 代码中创建 Razor 页面 URL?
- image - 上传前颤振调整图像大小
- javascript - TypeError: contents[indice].css is undefined, can't access property "display" of it[了解更多]
- php - 如何为 2 个准备好的语句编写事务以确保提交或回滚
- java - JMeter 的 JVM 在 10 分钟后崩溃
- mysql - 通过查询中的两列获取最新记录
- cmake - 制作。如何在 Qt5Linguist 中找到所有要翻译的文件?
- android - 滚动到 RecyclerView 的底部需要一些延迟然后应用
- php - 如何更新其他表中的状态?