将不同版本(python 2.7 vs 3.5)上传到 PyPI

Uploading different versions (python 2.7 vs 3.5) to PyPI

我有一个要上传到 PyPI 的包,其中包含两个不同版本的代码:一个用于 Python 2.7,一个用于 Python 3.5。

上传到 PyPI 的标准是什么?我是否使用两个单独的 setup.py 文件?

当用户运行pip install mypackage会自动下载正确的版本吗?

TL;DR:在 setup.py 上添加 python_requires。使用 twine 将包上传到 PyPI。

和 IPython 一样,它的 6.0.0+ 仅支持 Python 3.3+ 而 5.x 仍然支持 Python 2.x。如果您使用 pip >= 9.0.1 安装它,pip install ipython 将 select 最新的 5.x for Python 2 和最新的 6.x for Python 3.

修改setup.py

首先,您需要在 setup.py 中设置 Requires-Python (PEP 440) 元数据,方法是将 python_requires 参数放在 setup() 函数上。

例如下面是Python 2.7版本的setup.py

setup(
    name='some-package',
    version='2.3.3',
    ...,
    python_requires='==2.7.*'
)

对于Python 3.5+,只需将其更改为python_requires='>=3.5'

当然,两个包必须有不同的版本号。否则 PyPI 将拒绝一个。

您可以使用两个单独的 setup.py 文件来执行此操作, 或者只使用一个文件并动态设置 python_requires 参数。

上传到 PyPI

python setup.py sdist upload 似乎没有将包元数据(包含 Requires-Python)上传到 PyPI。

我发现最简单的正确方法是使用 twine.

  1. Create some distributions in the normal way:

    $ python setup.py sdist bdist_wheel
    
  2. Register your project (if necessary)

  3. Upload with twine

    $ twine upload dist/*
    

对 Python 2 和 3 版本重复步骤 1 和 3。