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
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1475249
Accepted
Esther
Esther
Asked: 2023-06-29 02:30:56 +0800 CST2023-06-29 02:30:56 +0800 CST 2023-06-29 02:30:56 +0800 CST

为什么 apt 如此依赖于各个 Python 版本?

  • 772

我们在这里收到了很多关于人们乱搞 Python 版本并破坏他们的系统的问题,最明显的是 apt 无法正常运行。我知道许多 Ubuntu 软件包需要特定版本的 Python才能正常运行。

我的问题是:是什么导致较新/不同的 Python 版本与 apt 不兼容?这些包是否依赖于仅存在于某些版本中的语言功能,或者 apt 依赖于哪些特定于版本的 Python 功能使其仅适用于某个特定的 Python 版本?

apt
  • 1 1 个回答
  • 103 Views

1 个回答

  • Voted
  1. Best Answer
    mchid
    2023-06-29T18:53:25+08:002023-06-29T18:53:25+08:00

    是的,通常是特定的语言特性只存在于某个Python版本中。

    根据问题的不同,当像 apt 或更可能是 dpkg 这样的应用程序调用使用新版本中不存在的错误语法的某些内容时,您经常会收到错误。

    然而apt 本身并不依赖于 python,对于 dpkg 也是如此——但是依赖于 python 的包通常具有调用 python 或 python 脚本的安装前和安装后脚本。

    例如,如果您下载 的 deb 文件software-properties-gtk,解压该文件,然后解压该control.tar.xz文件,您将看到一个prerm脚本。

    该脚本是一个 sh 脚本,但您可以看到它也调用 python:

    #!/bin/sh
    set -e
    
    # Automatically added by dh_python3:
    if which py3clean >/dev/null 2>&1; then
        py3clean -p software-properties-gtk 
    else
        dpkg -L software-properties-gtk | perl -ne 's,/([^/]*)\.py$,/__pycache__/\1.*, or next; unlink $_ or die $! foreach glob($_)'
        find /usr/lib/python3/dist-packages/ -type d -name __pycache__ -empty -print0 | xargs --null --no-run-if-empty rmdir
    fi
    
    # End automatically added section
    

    Sopy3clean是 的一部分python3-minimalpython3,此脚本在文件第一行的 shebang 中调用,如以下命令所示:

    which py3clean
    

    这应该表明/usr/bin/py3clean:

    head /usr/bin/py3clean 
    

    输出:

    #! /usr/bin/python3
    # vim: et ts=4 sw=4
    
    # Copyright © 2010-2012 Piotr Ożarowski <[email protected]>
    #
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    

    这很重要,因为正如您通过以下命令看到的那样,实际文件/usr/bin/python3不存在:

    file /usr/bin/python3
    

    在 20.04 上,这告诉我这/usr/bin/python3是一个到 python3.8 的符号链接,并which python3.8显示该文件是/usr/bin/python3.8. 此外,file /usr/bin/python3.8确认这是用于 python3 的实际 Python 可执行文件。

    因此software-properties-gtk,如果安装了 python3,该包期望安装的 python3 版本是 python3.8。

    该py3clean脚本可能适用于不同的 python 版本,也可能不适用于,但通常会对 python 进行足够多的更改,因此该脚本中的某个位置可能至少有一个更改会导致某种类型的错误。

    即使不是针对这种特殊情况,您也明白了。

    我想总结一下,这实际上不是 apt 的问题,而是更多的 python 问题,因为 python 脚本经常使用通用的 shebang,当 shebang 指定 or 甚至 or 时,它期望特定版本的 python,因为/usr/bin/python这些/usr/bin/python3都/usr/bin/env python没有/usr/bin/env python3指向实际文件中,它们都指向一个符号链接,该链接指向系统上安装的默认 python 版本。

    由于大多数软件包都是针对特定版本的 Ubuntu 发布的,因此它们都期望 Python 的默认版本是相同的。否则,每个包都将依赖于任意不同的 Python 版本,并且我们最终可能会在同一系统上安装 3 个或更多版本的 Python,只是为了满足依赖关系。

    通常,如果您想要或需要安装不同版本的 Python,那是因为您有特定的原因。出于这个原因,没有什么可以阻止您使用不同版本的 Python,只要您不弄乱其他软件在调用 或 时使用的默认 Pythonpython版本python3。

    因此,如果您确实安装了备用版本,您将无法方便地通过默认版本调用该备用版本python或python3将其作为默认版本 - 您将需要通过调用来专门指定版本python3.9,例如,当您使用它时。

    我想我应该为阅读此答案的其他人添加免责声明。如果你想在你的系统上安装不同版本的 python,你应该四处询问以找到正确的方法。一个系统上可以有多个版本的 Python,但为了避免出现问题,您不得以任何方式卸载、更改或更改 Python 的默认版本。但我认为更详细的内容不属于这个问题的范围。

    • 2

相关问题

  • 如何编写 shell 脚本来安装应用程序列表?

  • 如何查看存档中可用的软件包的所有版本?

  • 是否可以说出我安装的哪些软件包不在原版安装中?

  • 如何删除 PPA?

  • 使用 apt-get upgrade 时如何强制安装内核更新?

Sidebar

Stats

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

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve