我想从 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 版本。