具有独立依赖项的Python命名空间

时间:2020-01-31 19:27:20

标签: python setuptools

我有一个大型项目,我想分成多个单独的可安装软件包。当前的布局是:

├── 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
  )

但这在随后的设置调用中失败。

我仍然不知道如何根据'package.c'来描述'package.c',尽管我怀疑如果将{package-b'添加到install_requires列表中,它将可以它。

在我看来,这可能是关于如何生成轮子并通过PyPi提供单独的软件包的误解。

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

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

0 个答案:

没有答案