根据实现(PyPy / CPython 支持)在 setup.py 脚本中指定额外的依赖项

Specifying additional dependencies in setup.py script based on implementation (PyPy / CPython support)

前言

我有一个包含 PyPy support and for CPython 用户的包,它具有 mypy 作为附加依赖项,我将其指定为

import platform

from setuptools import setup
...
install_requires = [...]
if platform.python_implementation() != 'PyPy':
    install_requires.append('mypy>=0.630')
setup(...,
      install_requires=install_requires)

在本地它工作正常,但是当我通过 CPython 创建 source distribution 时,比如

> python setup.py sdist

并尝试通过 PyPy 安装它

> pypy3 -m pip install path/to/package.tar.gz

它尝试安装 mypy(并且由于 mypy 使用特定于 CPython 的软件包而失败),因此看起来依赖于 CPython 版本(为其创建了分发版)。

问题

我如何指定依赖项并创建一次源分发,以便它适用于 CPython 和 PyPy 版本(并随后上传到 PyPI)?

您当前的脚本在构建时而不是在安装时测试平台。

您需要使用的不是platform模块,而是PEP 508:

中定义的环境标记
from setuptools import setup
...
install_requires = [...,
                    'mypy>=0.630; implementation_name != "PyPy"']
setup(...,
      install_requires=install_requires)

参考文献: