【问题标题】:Uploading different versions (python 2.7 vs 3.5) to PyPI将不同版本(python 2.7 vs 3.5)上传到 PyPI
【发布时间】:2017-02-28 01:45:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: python pip pypi


    【解决方案1】:

    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 参数。

    上传到 PyPI

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

    我发现正确执行此操作的最简单方法是使用twine

    1. 以正常方式创建一些分布:

      $ python setup.py sdist bdist_wheel
      
    2. 注册您的项目(如有必要)

    3. 用麻线上传

      $ twine upload dist/*
      

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

    【讨论】:

    • 这种方法会自动检测我正在使用哪个版本的包,具体取决于 pip 绑定的 python 版本?还是我需要指定包版本号?
    • 自动,用于 pip 9.0.1 或更高版本。检查https://pypi.python.org/simple/<package-name>/页面的来源,如果一切正常,链接应该像<a data-requires-python=">=3.5" href=…。 pip 使用此信息来选择版本。
    猜你喜欢
    • 2020-05-03
    • 2017-06-09
    • 1970-01-01
    • 2010-12-13
    • 2016-01-24
    • 2017-06-11
    • 2016-07-25
    • 2017-06-19
    相关资源
    最近更新 更多