48 votes

"Votre installation de python3 est corrompue"

Je veux passer de Ubuntu 16.04.5 LTS à 18.04, j'ai donc exécuté sudo do-release-upgrade. Après avoir téléchargé et extrait bionic.tar.gz, j'obtiens:

Impossible de mettre à jour 

Votre installation de python3 est corrompue. Veuillez réparer le lien symbolique '/usr/bin/python3'.

J'ai vu Comment réparer "l'installation de python est corrompue"? et j'ai donc exécuté sudo ln -sf /usr/bin/python3.6 /usr/bin/python3 en pensant que ce serait un problème similaire. Mais cela n'a pas fonctionné (le même message d'erreur apparaît toujours).

J'ai plusieurs versions de python:

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

$ update-alternatives --display python3
python3 - mode automatique
  la meilleure version est /usr/bin/python3.6
  le lien pointe actuellement vers /usr/bin/python3.6
  le lien python3 est /usr/bin/python3
/usr/bin/python3.5 - priorité 1
/usr/bin/python3.6 - priorité 2

Comment puis-je réparer python3?

71voto

J. B. Rainsberger Points 811

Je suis tombé sur ce problème sur Pop!_OS 18.04 en essayant de passer à la version 18.10, et il s'est avéré que le problème se trouvait dans le lien symbolique pour /usr/bin/python et non pour /usr/bin/python3. J'avais configuré /usr/bin/python3.6 comme une alternative pour python (pas python3), et quand j'ai modifié cela, alors j'ai pu exécuter do-release-upgrade comme prévu.

J'aurais préféré que le message d'erreur pointe vers python et non vers python3.


Avant, avec le problème :

$ update-alternatives --display python
python - mode manuel
  le meilleur lien est /usr/bin/python3.6
  le lien pointe actuellement vers /usr/bin/python2.7
  le lien python est /usr/bin/python
/usr/bin/python2.7 - priorité 1
/usr/bin/python3.6 - priorité 2 

Je l'ai corrigé de cette manière :

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

Voir aussi ce commentaire ci-dessous qui décrit une solution plus précise qui explique également mieux ce qui se passe et comment le résoudre.

39voto

wjandrea Points 13147

Vous devez utiliser la version par défaut de Python 3 pour 16.04. C'est 3.5, pas 3.6. Alors exécutez :

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

Si cela ne fonctionne pas, essayez de réinstaller le paquet python3.

sudo apt-get install --reinstall python3

En passant, update-alternatives --display python3 devrait vous donner update-alternatives: error: no alternatives for python3. Les différentes versions de Python ne sont pas des alternatives dans Ubuntu.

13voto

xeruf Points 262

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

12voto

Daniel K. Points 366

J'ai observé ce message d'erreur sur Windows 10 1903 exécutant WSL Ubuntu lorsque je voulais passer de 16.04 LTS à 18.04 LTS.

Après l'échec de do-release-upgrade, j'ai basculé les alternatives de python vers chaque choix offert par update-alternatives --config python et j'ai à nouveau lancé la commande de mise à niveau. Cela n'a pas aidé.

Ensuite, j'ai vérifié le fichier journal /var/log/dist-upgrade/main.log qui contenait les lignes

2019-09-02 20:58:08,686 DEBUG _pythonSymlinkCheck run
2019-09-02 20:58:08,687 DEBUG le lien symbolique python pointe vers: '/etc/alternatives/python', mais l'attendu est 'python2.7' ou
'/usr/bin/python2.7'
2019-09-02 20:58:08,688 ERREUR pythonSymlinkCheck() a échoué, arrêt en cours

Alors que le message d'erreur mentionne python3, le problème concerne python2.

Le script de mise à niveau vérifie que /usr/bin/python pointe vers /usr/bin/python2, voir le code source de DistUpgrade/DistUpgradeController.py ici: ubuntu launchpad

Donc une solution est de supprimer complètement python du système alternatif et d'ajouter le lien manuellement, comme décrit dans la réponse la plus populaire.

Si vous ne voulez pas supprimer python du système alternatif, changez uniquement le lien pour la durée du processus de mise à niveau:

# rm /usr/bin/python 
# ln -sf /usr/bin/python2.7 /usr/bin/python
# do-release-upgrade

Cela a fonctionné pour moi.

Pendant le processus de mise à niveau, le lien est automatiquement réparé. Ainsi, une fois la mise à niveau terminée, il pointe vers l'entrée python dans le répertoire des alternatives:

$ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 24 Sep  2 22:01 /usr/bin/python -> /etc/alternatives/python

Édit: pour des informations approfondies, le problème pourrait également apparaître si vous passez de 18.04 LTS à 19.04 et la réponse s'applique également à cette situation.

6voto

Diego Pino Points 161

Essentiellement, la solution à ce problème consiste à faire en sorte que /usr/bin/python pointe vers la bonne version de Python attendue par votre version d'Ubuntu (par exemple, Python 2.7 pour 16.04 et Python 3.6 pour 18.04).

Si vous avez plusieurs versions de Python installées sur votre système, vous pourriez utiliser update-alternatives pour les gérer. Peu importe que votre alternative par défaut pour Python soit la bonne version attendue par votre système (3.6 dans Ubuntu 18.04), cela ne fonctionnera pas.

La raison pour laquelle cela ne fonctionne pas est que, lorsque vous utilisez update-alternatives, /usr/bin/python3 pointe vers /etc/alternatives/python3, et il semble que ce n'est pas exactement la même chose que de faire en sorte que /usr/bin/python3 pointe vers /usr/bin/python3.6.

C'est pourquoi la solution à ce problème consiste souvent à arrêter de gérer vos versions de Python3 avec update-alternatives et à faire en sorte que /usr/bin/python3 pointe vers la bonne version de Python3 attendue par votre système.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X