setup.py:限制python解释器的允许版本

Posted

技术标签:

【中文标题】setup.py:限制python解释器的允许版本【英文标题】:setup.py: restrict the allowable version of the python interpreter 【发布时间】:2012-12-05 04:25:56 【问题描述】:

我有一个 Python 库。不幸的是,我还没有更新它以使用 Python 3。

在其setup.py 中,我添加了

install_requires=['python<3'],

我的意图是不允许在 Python 3 下安装/使用这个包,因为我知道它(还)不起作用。我认为这不是正确的做法,因为pip 然后尝试下载并安装 python 2.7.3(这已经是已安装的版本!)。

我应该如何指定我的库依赖于特定范围的 Python 解释器版本?我应该添加Programming Language :: Python :: 2 :: Only 标签吗?这实际上会阻止在 Python 3 下安装吗?如果我还想将最低版本限制为 Python 2.6,该怎么办?

我更喜欢一种适用于任何地方的解决方案,但会满足于只适用于pip 的解决方案(希望不会导致easy_install 窒息)。

【问题讨论】:

在这里回答:***.com/questions/13385337/… 相关:packaging.python.org/guides/…,其中提到“虽然分类器列表通常用于声明项目支持的 Python 版本,但此信息仅用于在 PyPI 上搜索和浏览项目,而不用于安装项目。要实际限制可以安装项目的 Python 版本,请使用 python_requires 参数。" 【参考方案1】:

从version 9.0.1 开始,pip 将采用新的python_requires 字符串,指定安装所需的 Python 版本,例如,如果希望强制执行最低 Python 版本 3.3:

setup(
    ...,
    python_requires=">=3.3"
)

有关详细信息,请参阅here。另请参阅 SO 上的 answer。

【讨论】:

我认为值得编辑答案,包括必须使用 pip3 install [-e] 安装项目这一事实,正如您提供的第一个链接中提到的那样。 @GuyAvraham 你能澄清你的评论吗? pip2 install 如果它是最新版本的 pip 也应该尊重这一点(据我所知,pip 9.0 与 python 2.6 兼容)。 我添加了一个答案来详细说明这一点。【参考方案2】:

一个可能的解决方案是测试 Python 版本,因为pip 不能满足 Python 版本,除了它当前运行的版本(它安装在当前 Python 环境中):

import sys
if not sys.version_info[0] == 2:
    sys.exit("Sorry, Python 3 is not supported (yet)")

setup(...

【讨论】:

没错,那行得通。不过,在依赖项中内置一些东西会更好,这样 pip 会预先知道不必费心下载和运行安装程序。 为什么不两者兼而有之?您的答案是应该 做的,而是应该依赖内置功能,尽管使用这个答案另外python_requires 会很棒!你可以更新吗?【参考方案3】:

在上面的答案中发表评论并收到反馈后,我想将我的评论变成答案。请注意,上面的答案都很好,但根据我的经验,我发现这些答案中“缺少”一件事,需要指出,所以我将在此说明这个问题。

为了说明的简单性和完整性,我编写了一个非常简单的 Python 3 项目。它使用的唯一 3rd 方包是著名的 SSH 客户端包paramiko(它的官方 PyPi 页面可以找到here)。

我的项目虚拟环境中的Python解释器版本是3.6.9

现在,为了检查 python_requires 属性“正在运行”,我已将其添加到项目的 setup.py 脚本中,如下所示:

from setuptools import setup, find_packages

setup(name='mySampleProject',
      version='1.0',
      description='Sample project in Python 3',
      author='Guy Avraham',
      license='MIT',
      packages=find_packages(),
      include_package_data=True,
      python_requires='>=3.8',
      install_requires=['paramiko'])

请注意,我“要求”Python 版本为 3.8+。这当然应该与项目虚拟环境中的当前 Python 版本(即 3.6.9)一起使用。

现在,当我使用setup.py 中的“正常”用法(即运行:python3 setup.py install)构建项目时,项目已成功构建。运行python3 setup.py install 命令后查看pip3 list 命令的以下输出:

(mySampleProject_env) guya@ubuntu:~/mySampleProject$ pip3 list
DEPRECATION: The default format will switch to columns in the future. You can use -- 
format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
bcrypt (3.2.0)
cffi (1.14.3)
cryptography (3.1.1)
mySampleProject (1.0)
paramiko (2.7.2)
pip (9.0.1)
pkg-resources (0.0.0)
pycparser (2.20)
PyNaCl (1.4.0)
setuptools (39.0.1)
six (1.15.0)

如您所见,该项目及其所有“子依赖项”已安装,即使我没想到它也会安装。

另一方面,当我使用以下命令安装项目时:pip3 install -e .(注意. 表示“当前工作目录”),我得到以下输出:

(mySampleProject_env) guya@ubuntu:~/mySampleProject$ pip3 install -e .
Obtaining file:///home/guya/mySampleProject
mySampleProject requires Python '>=3.8' but the running Python is 3.6.9

现在确实“考虑”了python_requires 属性,因此“失败”了项目的构建。

在this page教程的第一段中有详细说明 以及在 this video 的几分钟内 ~09:00 - 11:00

注意:我确实检查以上所有内容以了解 Python 2(或 pip 了解 Python 2)。

【讨论】:

我认为这是因为你的 python 3.6.9 有一个旧版本的 setuptools。如果你 pip install -U setuptools 我猜它会尊重 python_requires 论点。尴尬的是这个功能相对较新,因为旧版本的 python 最需要它! @Noah - 我尝试了您的建议:使用venv 和 Python 3.8.5(Ubuntu 20.04 桌面)创建虚拟环境。 setuptools 版本是 44.0.0。按照您的建议将setuptools 升级到版本 50.3.2,使用“正常 setup.py 安装”(即 - python3 setup.py install)执行安装,但仍然没有考虑到 python_requires“属性”(即 -该项目已成功安装,即使 Python 版本是 3.8.5 并且我要求 >=3.9)。当我使用命令pip3 install -e . 执行此操作时,安装失败(根据需要)。

以上是关于setup.py:限制python解释器的允许版本的主要内容,如果未能解决你的问题,请参考以下文章

Python中setup.py一些不为人知的技巧

让 sphinx 使用 setup.py 中的版本

python setup.py bdist_wheel 报错的处理办法

Python setup.py和MANIFEST.in文件

Python进行RSA安装加密

main.py怎么打开