36

我有一个 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窒息)的解决方案。

4

3 回答 3

36

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

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

有关更多详细信息,请参见此处。另请参阅 SO 上的这个答案

于 2017-07-27T23:10:26.353 回答
18

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

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

setup(...
于 2012-12-18T01:53:06.047 回答
4

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

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

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

现在,为了检查python_requires“in action”属性,我将其添加到项目的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,项目已成功构建。pip3 list运行命令后查看命令输出如下python3 setup.py install

(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属性,从而“失败”了项目的构建。

在本页教程的第一段以及本视频 中的分钟 ~09:00 - 11:00 中有详细说明

注意:我没有Python 2(或pipPython 2)检查以上所有内容。

于 2020-10-16T09:20:04.943 回答