我们在这里收到了很多关于人们乱搞 Python 版本并破坏他们的系统的问题,最明显的是 apt 无法正常运行。我知道许多 Ubuntu 软件包需要特定版本的 Python才能正常运行。
我的问题是:是什么导致较新/不同的 Python 版本与 apt 不兼容?这些包是否依赖于仅存在于某些版本中的语言功能,或者 apt 依赖于哪些特定于版本的 Python 功能使其仅适用于某个特定的 Python 版本?
我们在这里收到了很多关于人们乱搞 Python 版本并破坏他们的系统的问题,最明显的是 apt 无法正常运行。我知道许多 Ubuntu 软件包需要特定版本的 Python才能正常运行。
我的问题是:是什么导致较新/不同的 Python 版本与 apt 不兼容?这些包是否依赖于仅存在于某些版本中的语言功能,或者 apt 依赖于哪些特定于版本的 Python 功能使其仅适用于某个特定的 Python 版本?
是的,通常是特定的语言特性只存在于某个Python版本中。
根据问题的不同,当像 apt 或更可能是 dpkg 这样的应用程序调用使用新版本中不存在的错误语法的某些内容时,您经常会收到错误。
然而apt 本身并不依赖于 python,对于 dpkg 也是如此——但是依赖于 python 的包通常具有调用 python 或 python 脚本的安装前和安装后脚本。
例如,如果您下载 的 deb 文件
software-properties-gtk
,解压该文件,然后解压该control.tar.xz
文件,您将看到一个prerm
脚本。该脚本是一个 sh 脚本,但您可以看到它也调用 python:
So
py3clean
是 的一部分python3-minimal
python3
,此脚本在文件第一行的 shebang 中调用,如以下命令所示:这应该表明
/usr/bin/py3clean
:输出:
这很重要,因为正如您通过以下命令看到的那样,实际文件
/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,只要您不弄乱其他软件在调用 或 时使用的默认 Python
python
版本python3
。因此,如果您确实安装了备用版本,您将无法方便地通过默认版本调用该备用版本
python
或python3
将其作为默认版本 - 您将需要通过调用来专门指定版本python3.9
,例如,当您使用它时。我想我应该为阅读此答案的其他人添加免责声明。如果你想在你的系统上安装不同版本的 python,你应该四处询问以找到正确的方法。一个系统上可以有多个版本的 Python,但为了避免出现问题,您不得以任何方式卸载、更改或更改 Python 的默认版本。但我认为更详细的内容不属于这个问题的范围。