【问题标题】:How to specify exact version of python as part of virtual environment requirements如何指定 python 的确切版本作为虚拟环境要求的一部分
【发布时间】:2019-11-01 16:24:41
【问题描述】:

我试图查看这是否是重复的,但无法准确找到这个问题。我对这些东西也很无知。

我正在使用 Python 3.7.2(我的 Windows 10 计算机上的唯一 Python 版本)并使用 venv 创建了一个虚拟环境:

python -m venv /path/to/new/virtual/environment

我通过 pip install 添加了一些包,并通过 pip freeze 创建了一个 requirements.txt 文件。我使用虚拟环境中的包编写了一些代码。

我想与同事分享我的代码。我可以给他们代码和需求文件,但是 requirements.txt 没有指定我使用的 python 版本(3.7.2)。将这些信息传达给我的同事的适当机制是什么?是否可以修改 requirements.txt 文件以包含我使用 3.7.2 以及运行我的代码的任何人也应该使用 3.7.2 的事实?这个问题的答案是否取决于我或我的同事是否在我们的计算机上安装了多个版本的 python?

【问题讨论】:

  • 您可以使用 setup.py 来实现这一点。但总的来说,您应该使您的代码尽可能与不同的 Python 版本兼容。
  • @KlausD。有点不同意。 3.7 中有很多有趣的特性,我发现这些特性足以令人信服地打破向后兼容性。除非您想向许多客户发布库,否则我看不到太多目的。 @rhz 我发现tox 是解决这个问题的好工具。它处理指定 python 版本,为您创建虚拟环境以及更多出色的功能。这是一个很好的起点github.com/ferencberes/tox-example
  • 另一个关于 tox 的说明,如果你想支持多个版本,你可以设置它,以便在你希望定位的所有主要/次要版本上自动运行测试。

标签: python pip virtualenv


【解决方案1】:

当您的系统具有多个 python 版本时,具有不同 python 版本的 Venv 更为重要。例如,CentOS 7 EPEL 自带 python 2.7 和 python 3.4 安装。当您尝试查找更新的版本时,您无法在官方存储库中找到它。这是因为长期支持模型将某些嵌入式工具固定到特定版本,并且只提供对错误修复的支持。 3.4.1 可能是初始版本,但更新可用于 3.4.2 和 3.4.3。那么如何使用 3.5 或 3.6 或 3.7 呢?您从源代码构建它并将其安装在其他位置(/usr/local/bin 或 /usr/opt/bin)。

这就是 Venv 真正闪耀的地方。

在常规提示下,python3 将调用 python3.4,python 将调用 2.7。

但是您可以使用您选择的 python 进行开发。

示例:您在 alt 位置安装 python3.7。系统 python 没有改变,所有系统实用程序都可以正常工作。

/usr/local/bin/python3.7 -m venv mypython_dir 创建一个新的虚拟环境。

source mypython_dir/bin/activate 将激活那个环境

从那时起,python 是 python3.7,pip 是从 /usr/local/bin 目录复制到 venv 目录的 pip3.7。

在 Windows 上,这不是一个问题,因为 python 没有嵌入到系统级别。你会看到很多关于人们在 LTS 版本上强制升级到系统 python 的 Linux 系统的问题。坏事发生。如果您想要或需要特定版本来运行您的模块,那么上面 Grismar 的答案就是您想要做的。

【讨论】:

    【解决方案2】:

    通常,您的脚本应该要求用户安装旧版本的 Python。 Python 很少会破坏向后兼容性(例如从 2.x 升级到 3.x),因此确实没有必要指定 3.x 的特定版本

    当然,也有可能是你同事的版本太旧了,应该升级一下。您的脚本可以简单地检查是否有足够新的 Python 版本可用:

    import sys
    
    if sys.version_info.major < 3 or sys.version_info.minor < 5:
        print("Python version 3.5 or newer required.")
        exit(1)
    

    只要确保您知道为什么需要特定版本即可。如果您的同事安装了足够最新的版本并且他们从requirements.txt 安装包,包管理器将自动安装适合其当前 Python 版本的包版本,并且假设这些包是维护良好的包,它们还应该向后兼容。如果没有,您可以在requirements.txt 中指定包的特定版本。

    如果您要分享的内容本身就是一个包,您可以在setup.py 中进行此操作,更多信息请点击此处Prevent package from being installed on old Python versions

    请注意,如果您希望上述内容在 3.x 之后继续工作(因为 4.0 的次要版本将为 0,即

    if sys.version_info < (3, 5):
        etc.
    

    但这假设 4.x 也将向后兼容您正在执行的所有操作 - 取决于您希望具体执行的操作,您可能还希望为未来的版本设置一个例外。

    【讨论】:

    • 我不会说 Python 很少会打破向后兼容,但他们至少尝试不这样做。 Python 3 次要版本更改中的 async 关键字更改仍然存在大量项目。如果 Python 4 给这个问题增加了更多的麻烦,我不会感到惊讶。
    • 你的版本测试坏了;当 Python 4.0 出现时,由于minor 版本小于5,它会失败。字典顺序很难;只需让tuple 比较器为您做这件事:if sys.version_info &lt; (3, 5): 是正确且更简洁的(并且在 version_info 成为命名元组之前适用于版本 2.6/3.0 及更早版本)。如果您真的对他们重新排序 sys.version_info 或想要全名感到疑虑,if (sys.version_info.major, sys.version_info.minor) &lt; (3, 5): 也可以使用(除非您使用的是 2.6/3.0 或更早版本)。
    • 这是一个很好的观点@ShadowRanger,虽然在那个时候,可能存在向后兼容性破坏性更改,这也会导致脚本失败,因此需要检查并可能需要更改。跨度>
    • @Grismar:是的,如果你想小心避免声称支持 4.0,你可以写成if not (3, 5) &lt;= sys.version_info &lt; (4, 0):。使用原始测试会在 4.0 上失败,然后突然在 4.5 上工作,所以无论您打算为 4.x 做什么,这都不是正确的方法。
    • @rhz:理论上,Python (大部分)使用语义版本控制,因此在微版本之间不应该引入重大更改,更不用说重大更改了。它并不完美(Python 2.7,作为最终的 Python 版本,有意进行了一些重大更改,例如,在 2.7.9 中,他们显着重构了 ssl 模块以提高 SSL 安全性并更容易编写同时针对 2.7.9 的代码+ 和 3.4+;其他微版本 have accidentally broken compatibility),但大多数时候,你是安全的。
    猜你喜欢
    • 1970-01-01
    • 2017-12-30
    • 2021-04-18
    • 2020-10-21
    • 2016-04-05
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多