“您的 python3 安装已损坏”

“您的 python3 安装已损坏”

我想从 Ubuntu 16.04.5 LTS 升级到 18.04,所以运行了sudo do-release-upgrade。下载并解压后,bionic.tar.gz我得到:

Can not upgrade 

Your python3 install is corrupted. Please fix the '/usr/bin/python3'
symlink.

我看见如何修复“python 安装已损坏”?所以我确实sudo ln -sf /usr/bin/python3.6 /usr/bin/python3认为这是一个类似的问题。但是没有奏效(仍然是相同的错误消息)。

我有几个 Python 版本:

$ ls /usr/lib | grep python
python2.7
python3
python3.5
python3.6

$ update-alternatives --display python3
python3 - auto mode
  link best version is /usr/bin/python3.6
  link currently points to /usr/bin/python3.6
  link python3 is /usr/bin/python3
/usr/bin/python3.5 - priority 1
/usr/bin/python3.6 - priority 2

我该如何修复python3

答案1

我刚刚在 Pop!_OS 18.04 上遇到了这个问题,试图升级到 18.10,结果发现问题出在/usr/bin/python和 不是 的符号链接上/usr/bin/python3。我曾/usr/bin/python3.6将其配置为python(不是) 的替代方案,当我更改它时,我就可以按预期python3运行。do-release-upgrade

我希望错误信息指向python而不是python3


之前遇到的问题:

$ update-alternatives --display python
python - manual mode
  link best version is /usr/bin/python3.6
  link currently points to /usr/bin/python2.7
  link python is /usr/bin/python
/usr/bin/python2.7 - priority 1
/usr/bin/python3.6 - priority 2 

我是这样修复的:

$ sudo update-alternatives --remove-all python
$ sudo ln -sf /usr/bin/python2.7 /usr/bin/python

另请参阅下面这个评论它描述了一个更精确的解决方案,也更好地解释了发生了什么以及如何解决它。

答案2

您需要使用 16.04 的默认 Python 3 版本。3.5,而不是 3.6。因此运行:

sudo ln -sf /usr/bin/python3.5 /usr/bin/python3

如果这不起作用,请尝试重新安装该python3包。

sudo apt-get install --reinstall python3

顺便说一句,update-alternatives --display python3应该给你update-alternatives: error: no alternatives for python3。不同版本的Python在Ubuntu中不是替代品。

答案3

这里的所有答案似乎都没有解释如何自己找到解决方案,因此我开始了一段旅程,在我的情况下是do-release-upgrade在 Ubuntu 18.04 LTS 上的 KDE Neon 中进行检查。

首先,我用tracefile -w并发现实际的发布升级脚本已被下载到一个/tmp/ubuntu-release-upgrader-xxxxxxxx目录中。

使用grep该目录,我发现了错误消息DistUpgradeController.py

❯ grep --line-number --recursive --binary-files=without-match "python3 install is corrupted"
DistUpgradeController.py:426:                             _("Your python3 install is corrupted. "

因此我检查了使用函数的周围代码,_pythonSymlinkCheck跳转到该代码并发现了问题的根源:该脚本期望符号链接/usr/bin/python3准确解析为/usr/bin/<debian_default_python>

binaries_and_dirnames = [("python3", "python3")]
for binary, dirname in binaries_and_dirnames:
    debian_defaults = '/usr/share/%s/debian_defaults' % dirname
    if os.path.exists(debian_defaults):
        config = SafeConfigParser()
        with open(debian_defaults) as f:
            config.readfp(f)
        try:
            expected_default = config.get('DEFAULT', 'default-version')
        except NoOptionError:
            logging.debug("no default version for %s found in '%s'" %
                          (binary, config))
            return False
        try:
            fs_default_version = os.readlink('/usr/bin/%s' % binary)
        except OSError as e:
            logging.error("os.readlink failed (%s)" % e)
            return False
        if not fs_default_version in (expected_default, os.path.join('/usr/bin', expected_default)):

从脚本中可以看出,<debian_default_python>关键default-version部分DEFAULT如下/usr/share/python3/debian_defaults

❯ cat /usr/share/python3/debian_defaults
[DEFAULT]
# the default python3 version
default-version = python3.6

我的链接确实指向了/usr/bin/python3.6,但是通过来自的额外间接引用update-alternatives,脚本无法解析:

❯ python
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.readlink("/usr/bin/python3")
'/etc/alternatives/python3'
>>> os.readlink("/etc/alternatives/python3")
'/usr/bin/python3.6'

所以最后我也采取了核选项,但现在我完全知道发生了什么:)

sudo ln -sf /usr/bin/python3.6 /usr/bin/python3

答案4

基本上,解决这个问题的方法包括指向/usr/bin/python你的 Ubuntu 版本所期望的正确的 Python 版本(例如,16.04 是 Python2.7,而 18.04 是 Python3.6)。

如果您的系统中安装了多个版本的 Python,您可能会使用update-alternatives它们来管理它们。无论您的默认 Python 替代方案是否是系统所需的正确版本(Ubuntu 18.04 中为 3.6),它都不会起作用。

这不起作用的原因是,当使用时update-alternatives/usr/bin/python3指向,这似乎与指向/etc/alternatives/python3并不完全相同。/usr/bin/python3/usr/bin/python3.6

这就是为什么解决这个问题的方法通常包括停止管理你的 Python3 版本update-alternatives并指向/usr/bin/python3你的系统期望的正确 Python3 版本。

相关内容