首页 > 解决方案 > 具有独立依赖关系的 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 提供单独的包的误解。

所以,我想这可以归结为两个问题:

  1. 我是否只生成一个轮子,将其上传到我们的 PyPi 镜像,然后它们可以单独安装?还是我需要生成 3 个单独的轮子,每个包一个,然后分别上传?
  2. 如何分离每个包的依赖项,以便安装 package.a 不会引入 package.c 的依赖项?

标签: pythonsetuptools

解决方案


推荐阅读