AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 760615
Accepted
siralbert
siralbert
Asked: 2023-11-04 20:22:27 +0800 CST2023-11-04 20:22:27 +0800 CST 2023-11-04 20:22:27 +0800 CST

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

  • 772

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

./python_script.py

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

这是一个示例测试脚本。

#!/usr/bin/env python3

import sys

def main():
  print(sys.version)

main()

在此输入图像描述

编辑:通过上述配置,我认为目前最快的解决方案(可能不是最好的,因为未来的后果,请参阅下面社区的详细解释的答案和评论)是更改 / 中 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

apt
  • 4 4 个回答
  • 2177 Views

4 个回答

  • Voted
  1. Best Answer
    Stephen Kitt
    2023-11-04T21:25:54+08:002023-11-04T21:25:54+08:00

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

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

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

    • 16
  2. Stéphane Chazelas
    2023-11-05T01:45:10+08:002023-11-05T01:45:10+08:00

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

    $ aptitude search -F%p '~i ~n "^python[0-9.]*$"'
    python3
    python3.10
    python3.11
    

    该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
    

    不要手动更改该符号链接。版本之间通常不兼容,并且 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
    

    或者创建一个:

    mkdir ~/.python3-is-python3.12
    ln -s /usr/bin/python3.12 ~/.python3-is-python3.12/python3
    

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

    • 10
  3. user000001
    2023-11-06T03:34:19+08:002023-11-06T03:34:19+08:00

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

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

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

    python3.11 -m venv venv
    

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

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

    . venv/bin/activate
    

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

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

    • 9
  4. Seamus
    2023-11-06T03:25:27+08:002023-11-06T03:25:27+08:00

    对于所有反对者:正如您从我与斯蒂芬的评论交流中看到的,这个答案需要更多的工作。我不需要更多的反对票来说服我这一点。完成研究后,我将更新/编辑/删除这个答案。




    由于您使用的是 Debian(或其衍生版本之一),因此您应该考虑使用该update-alternatives实用程序。它是为像您这样的情况而设计的 - 安装了同一程序的多个版本。

    例如,将默认值设置为驻留在 /usr/local/bin/ 中的 3.12 版本:

    sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 10
    

    响应应该是这样的(我实际上没有安装 Python 3.12):

    update-alternatives: using /usr/local/bin/python3.12 to provide /usr/bin/python3 (python3) in auto mode
    

    请参阅man update-alternatives参考资料 详细信息和其他选项。

    • -2

相关问题

  • 在发行版的不同版本中混合软件时要寻找什么?

  • 了解 apt 列表输出

  • 尝试安装 debian 软件包 npm,使 apt-get 删除 libssl-dev

  • 如何下载软件包而不是使用 apt-get 命令安装它?

  • /etc/apt/sources.list.d 比 /etc/apt/sources.list 有什么好处

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve