如果我的计算机上安装了两个版本的 python3(即:3.11.2 和 3.12),如何设置运行 python 脚本时使用的默认版本?

sir*_*ert 4 source version apt python3

我通常使用apt包管理器安装早期版本(3.11.2),并从源手动安装更高版本(3.12)。当我像这样执行 python 脚本时:

./python_script.py
Run Code Online (Sandbox Code Playgroud)

该脚本使用较早的版本而不是较新的版本。出于可移植性的原因,我想将默认的 shebang 行#!/usr/bin/env python3单独保留在脚本的开头。

这是一个示例测试脚本。

#!/usr/bin/env python3

import sys

def main():
  print(sys.version)

main()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑:通过上述配置,我认为目前最快的解决方案(可能不是最好的,因为未来的后果,请参阅下面社区的详细解释的答案和评论)是更改 / 中 python3 符号链接的目标/usr/local/bin/python3.12的/usr/local/bin/python3.12 的替代品,其中存储了我的 python3.12 二进制文件。

在此输入图像描述

编辑2:如第二个屏幕截图所示,./myscript.py通过验证该目录位于环境变量中的目录/usr/local/bin之前并将二进制文件重命名为./usr/binPATHpython3.12/usr/local/bin/python3

Ste*_*itt 16

由于您\xe2\x80\x99正在使用env python3,Python 的默认版本将由变量python3中第一个 的版本确定PATH。因此,您可以通过适当地构造变量来选择使用哪个版本PATH:如果您想要系统默认值,请确保/usr/bin出现在包含 的任何其他目录之前python3,如果您想要自己构建的 Python,请确保包含该版本的目录python3出现在 之前/usr/bin

\n

您提出的解决方案是您目前可以应用的最糟糕的解决方案之一。鉴于屏幕截图中显示的情况,您还没有\xe2\x80\x99 破坏您的系统:#!/usr/bin/python3在其shebang 中指定的系统Python 脚本仍然可以找到它们期望的模块。如果您更改/usr/bin/python3为指向 Python 3.12,这些脚本将无法访问系统上安装的 3.11 模块;尤其,python3-apt。这可能会产生不幸的后果。

\n

由于您在自己的脚本中指定#!/usr/bin/env python3,因此可以依赖PATH,我仍然认为PATH基于 - 的方法更适合您的情况。您甚至可以PATH在任何地方进行更改,以指向您的python3第一个,而不会破坏系统 Python 脚本(因为它们不依赖\xe2\x80\x99tPATH来查找 Python)。

\n


Sté*_*las 10

为了补充@StephenKitt 的好答案,在基于 Debian 的系统上,您可能能够同时安装多个版本的 python 软件包。例如,在 Ubuntu 22.04 上,我安装了 3.10 和 3.11:

$ aptitude search -F%p '~i ~n "^python[0-9.]*$"'
python3
python3.10
python3.11
Run Code Online (Sandbox Code Playgroud)

python3包依赖于python3.10并且python3可执行文件是到 的符号链接python3.10

$ zstat +link --  ${(v)commands[(I)python[0-9.]#]}
/usr/bin/python3 python3.10
/usr/bin/python3.10
/usr/bin/python3.11
Run Code Online (Sandbox Code Playgroud)

不要手动更改该符号链接。版本之间通常不兼容,并且 python 模块在 python 版本之间不共享,因此更改 python3 符号链接将破坏具有or (或现在通常是符号链接)python的脚本,并期望 python3 为 3.10 并有权访问到为 3.10 安装的 python 模块。#! /usr/bin/env python3#! /usr/bin/python3#! /bin/python3/bin/usr/bin

因此,如果您需要调用需要不同安装版本的 python 的脚本,并且无法将 shebang 更改为#! /usr/bin/python3.12,则只需将其调用为:

python3.12 /path/to/that-file.py
Run Code Online (Sandbox Code Playgroud)

或者创建一个:

mkdir ~/.python3-is-python3.12
ln -s /usr/bin/python3.12 ~/.python3-is-python3.12/python3
Run Code Online (Sandbox Code Playgroud)

~/.python3-is-python3.12在您的脚本中提前$PATH 但仅用于调用该脚本,全局设置它可能会破坏使用#! /usr/bin/env python3并期望python3成为系统默认值的其他脚本python3

  • 就其价值而言,本答案中描述的将目录注入“$PATH”的策略或多或少是 [pyenv](https://github.com/pyenv/pyenv) 以更用户友好的方式所做的。 (2认同)

use*_*001 10

我知道这个问题只询问apt包管理器,其他答案很好地涵盖了这方面。

但是,如果您正在处理多个不同的 python 项目,所有项目都需要不同的 python 版本和/或不同的依赖项,我强烈建议您使用虚拟环境 ( )venv来管理项目的 python 版本和依赖项。

要为项目安装虚拟环境,例如 3.11,请在项目的主目录中运行:

python3.11 -m venv venv
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为venv包含虚拟环境的目录。

然后,要使用该环境,请键入:

. venv/bin/activate
Run Code Online (Sandbox Code Playgroud)

从那时起,在当前 shell 中,您将能够运行python并且pip无需版本号,并且将使用正确的环境。要退出该环境,请键入deactivate

在新环境中,您将仅拥有pip在其中安装的依赖项,因此项目之间不会出现任何依赖项不匹配的情况。安装依赖项后,您还可以轻松地requirements.txt为项目创建文件。pip freeze > requirements.txt