Aucune des réponses ici ne semble expliquer comment vous pouvez arriver à la solution vous-même, alors je me suis lancé dans un voyage, dans mon cas en inspectant do-release-upgrade
dans KDE Neon sur Ubuntu 18 LTS.
Tout d'abord, je l'ai exécuté avec tracefile -w
et j'ai découvert que les scripts de mise à niveau de version réelle étaient téléchargés dans un répertoire /tmp/ubuntu-release-upgrader-xxxxxxxx
.
En utilisant grep
dans ce répertoire, j'ai trouvé le message d'erreur dans DistUpgradeController.py
:
grep --line-number --recursive --binary-files=without-match "python3 install is corrupted"
DistUpgradeController.py:426: _("Your python3 install is corrupted. "
J'ai donc inspecté le code environnant, qui utilisait la fonction _pythonSymlinkCheck
, j'ai sauté vers ça et découvert la source du problème : Le script attendait que le lien symbolique /usr/bin/python3
résolve exactement à /usr/bin/
:
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)):
Comme visible dans le script, est la clé default-version
dans la section DEFAULT
de /usr/share/python3/debian_defaults
:
cat /usr/share/python3/debian_defaults
[DEFAULT]
# the default python3 version
default-version = python3.6
Mon lien pointait vers /usr/bin/python3.6
, mais via une indirection supplémentaire de update-alternatives
, que le script ne résout pas :
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'
Donc à la fin, j'ai aussi opté pour l'option nucléaire, mais maintenant avec une connaissance complète de ce qui se passait :)
sudo ln -sf /usr/bin/python3.6 /usr/bin/python