Python 弱依赖项目打包

Python packaging of weakly dependent projects

我正在尝试找到一种打包和部署我创建的多个 python 包的好方法。最终,我想使用一些包存储库进行部署或创建某种安装脚本。

我的项目结构如下:我有两个子项目AB,它们都使用另一个自创包C中的工具。 C 中的工具仅供内部使用,一般用户不会感兴趣。然而,AB应该部署。我希望用户可以独立安装 AB,但我不会 need/want 将 C 部署为独立的。

在最好的情况下,我希望用户能够按照

的方式安装软件包
pip install my_project.A

pip install my_project.B

此外,在A中,我想导入C如下:

import my_project.C

我是否必须独立打包 ABC 并在 setuptools.setup 中使用 install_requires?如果所有的项目都属于一个大的 "meta-project",有没有一种方法可以将它们弱捆绑在一起,同时保持它们的总体独立性? (在我的示例中,C 包含 "tools"。我不想部署具有这种通用名称的包。我是否必须将其部署为 my_project_tools?)

有没有办法让从该元包安装的所有包都安装在同一文件夹层次结构中,同时允许安装该元包的单独组件? 有一个相关的答案here,但我的问题不同之处在于存在共同的依赖性C

我是包装新手,所以我很欣赏不需要太多背景知识的答案。

附加信息:我使用的是Python 3.7,该程序与较低版本不兼容。不过,它应该 运行 独立平台。有些模块需要编译和 Cython。

类似下面的东西可能是一个解决方案,其中 Nmspc 可以被认为是 meta-project PingPong。它没有经过实际测试,因此需要进行一些调整。

目录树可能如下所示:

.
├── NmspcCore
│   ├── nmspc
│   │   └── _core
│   │       ├── __init__.py
│   │       └── common.py
│   └── setup.py
├── NmspcPing
│   ├── nmspc
│   │   └── ping
│   │       ├── __init__.py
│   │       └── foo.py
│   └── setup.py
└── NmspcPong
    ├── nmspc
    │   └── pong
    │       ├── __init__.py
    │       └── bar.py
    └── setup.py

3 Python 个项目:

  • NmspcCore提供nmspc._core(前导下划线表示私有元素)不应直接安装
  • NmspcPing提供nmspc.ping并依赖于NmspcCore
  • NmspcPong 提供 nmspc.pong 并依赖于 NmspcCore

它们都使用了命名空间包。可以根据Python Packaging User Guide on "Packaging namespace packages, Native namespace packages". There is another example here.

中的说明进行设计

NmspcCore/setup.py:

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='NmspcCore',
    version='1.2.3',
    packages=['nmspc._core',],
)

NmspcCore/nmspc/_core/common.py

MARCO = 'polo'

NmspcPing/setup.py(同样 NmspcPong/setup.py):

#!/usr/bin/env python3

import setuptools

setuptools.setup(
    name='NmspcPing',
    version='1.2.3',
    packages=['nmspc.ping',],
    install_requires=['NmspcCore',],
)

NmspcPing/nmspc/ping/foo.py

import nmspc._core

print(nmspc._core.common.MARCO)

umbrella 项目 Nmspc 也可以考虑。这样的项目将是空的(没有实际代码),但会将 NmspcPingNmspcPong 作为直接依赖项,以便可以安装整个项目一次合奏。