【发布时间】:2017-02-28 01:45:18
【问题描述】:
我有一个要上传到 PyPI 的包,其中包含两个不同版本的代码:一个用于 Python 2.7,一个用于 Python 3.5。
上传到 PyPI 的标准是什么?我是否使用两个单独的setup.py 文件?
当用户运行pip install mypackage 时,它会自动下载正确的版本吗?
【问题讨论】:
我有一个要上传到 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 将为 Python 2 选择最新的 5.x,为 Python 3 选择最新的 6.x。
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 参数。
python setup.py sdist upload 似乎没有将包元数据(包含 Requires-Python)上传到 PyPI。
我发现正确执行此操作的最简单方法是使用twine。
以正常方式创建一些分布:
$ python setup.py sdist bdist_wheel注册您的项目(如有必要)
用麻线上传
$ twine upload dist/*
对 Python 2 和 3 版本重复第 1 步和第 3 步。
【讨论】:
https://pypi.python.org/simple/<package-name>/页面的来源,如果一切正常,链接应该像<a data-requires-python=">=3.5" href=…。 pip 使用此信息来选择版本。