Setuptools:使用具有不同所需包的构建变体

Setuptools: use build variants with different required packages

我想制作一个源码分发包 (sdist),就所需包而言,开发平台和目标平台需要有所不同。

更具体地说,当我为 Raspberry Pi(目标平台)打包时,我不需要 opencv-python,因为 OpenCV 是从那里的源构建的,但是在开发 PC 上(Ubuntu), 我需要 opencv-python.

我试着按照这样的技巧将 --raspi 参数传递给 setup.py:

install_requires = [
    'opencv-python >= 4.1.1',
    ...
]

if "--raspi" in sys.argv:
    install_requires = [req for req in install_requires if not req.startswith('opencv-python')]
    sys.argv.remove("--raspi")

setup(
    ...,
    install_requires=install_requires
)

当我 运行 python3 setup.py sdist --raspi 时,这种方法的工作程度使得生成的 ./dist/mypackage.tar.gz/mypackage/mypackage.egg-info/requires.txt 不再包含 opencv-python

但是当我运行pip3 install ./dist/mypackage.tar.gz的时候,还是会报这样的错误:

ERROR: Could not find a version that satisfies the requirement opencv-python>=4.1.1 (from mypackage==0.1) (from versions: none)

这也是当我将 --install-option="--raspi" 传递给 pip3 install 时,我在某处读到的是当 运行 从 pip.

当我手动编辑发行版 setup.py (./dist/mypackage.tar.gz/mypackage/setup.py) 并从所需的包中删除 opencv-python 时,pip3 安装就可以了。

是否有其他方法可以针对不同的构建设置不同的设置或要求?例如。使用两个不同的 setup.cfg 文件(如何?),每个文件指定它们的包集?我不太喜欢这种方法,因为我在这些方法中大部分都是重复的。

您可以使用环境标记(如 PEP 508 中指定)将要求限制在特定平台上:

install_requires = [
    'opencv-python >= 4.1.1; platform_machine == "x86_64"'
]

这将在 x86_64 arch 上安装 opencv-python,但在 ARM、PPC 等上跳过它。

添加到@hoefling 的回答中,我现在还发现了这个:

extras_require={  # Optional
        'dev': ['check-manifest'],
        'test': ['coverage'],
    },

来自pypa sampleproject。我将通过 pip install sampleproject[dev].

调用