"Votre installation python3 est corrompue"

13

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

Can not upgrade 

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

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

J'ai quelques versions de 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

Comment puis-je réparer python3?

mRcSchwering
la source
1
Et qu'en est-il de la réinstallation (comme mentionné dans la réponse acceptée)?
Kulfy

Réponses:

16

Vous devez utiliser la version Python 3 par défaut pour 16.04. C'est 3,5 , pas 3,6. Alors lancez:

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

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

sudo apt-get install --reinstall python3

Par ailleurs, update-alternatives --display python3devrait vous donner update-alternatives: error: no alternatives for python3. Différentes versions de Python ne sont pas des alternatives dans Ubuntu.

wjandrea
la source
32

Je viens de rencontrer ce problème sur Pop! _OS 18.04, en essayant de passer à 18.10, et il s'avère que le problème résidait dans le lien symbolique pour /usr/bin/pythonet non pour /usr/bin/python3. J'avais /usr/bin/python3.6configuré comme alternative pour python(pas python3), et quand j'ai changé cela, je pouvais alors courir do-release-upgradecomme prévu.

Je souhaite que le message d'erreur soit signalé pythonet non python3.


Avant, avec le problème:

$ 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 

Je l'ai fixé de cette façon:

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

Voir également ce commentaire ci-dessous qui décrit une solution plus précise qui explique également mieux ce qui se passe et comment y remédier.

JB Rainsberger
la source
1
Oui, je peux confirmer que la solution fonctionne, cette réponse doit être acceptée.
Sumit Jain
Cela a également fonctionné pour moi
Efi Kaltirimidou
3
Opter pour update-alternatives --remove-all pythonétait définitivement une surpuissance inutile: tout ce que vous aviez à faire était d'utiliser update-alternatives --config pythonpour avoir un pythonpoint sur la dernière python2.*(par exemple python2.7), puis utiliser update-alternatives --config python3pour avoir un python3point sur spécifiquement python3.6 - qui est la version par défaut de Python 3 pour 18.04.
KiriSakow
2
Si vous devez passer à python 3.7 dans Ubuntu 18.04, ne le faites pas l'ensemble du système - ou vous êtes lié pour finir par avoir des problèmes vilains petits ensemble du réseau avec des outils essentiels comme gnome-terminal, update-manager, etc. plutôt utiliser des environnements virtuels (documentation ici et ici )
KiriSakow
@Kiri Il existe des moyens d'installer d'autres versions de Python sans remplacer la ou les versions système. Par exemple, en utilisant le PPA Deadsnakes .
wjandrea
5

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 do-release-upgradeavoir échoué, j'ai changé d' pythonalternative à tous les choix proposés par update-alternatives --config pythonet j'ai réexécuté la commande de mise à niveau. Cela n'a pas aidé.

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

2019-09-02 20:58:08,686 DEBUG _pythonSymlinkCheck run
2019-09-02 20:58:08,687 DEBUG python symlink points to: '/etc/alternatives/python', but expected is 'python2.7' or
'/usr/bin/python2.7'
2019-09-02 20:58:08,688 ERROR pythonSymlinkCheck() failed, aborting

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

Le script de mise à niveau vérifie la /usr/bin/pythonliaison avec /usr/bin/python2, voir le code source DistUpgrade/DistUpgradeController.pyici: ubuntu launchpad

Une solution consiste donc à supprimer complètement python du système alternatif et à ajouter le lien manuellement, comme décrit dans la réponse la plus courante.

Si vous ne souhaitez pas supprimer python du système alternatif, modifiez simplement le lien uniquement pendant 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, lorsque la mise à niveau est terminée, elle 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

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

Daniel K.
la source
1
Remarque: Cette réponse s'applique également à une mise à niveau d'Ubuntu 18.04 LTS vers 19.04. Je l'ai essayé moi-même après la fin de la mise à jour vers 18.04.
Daniel K.
3

Fondamentalement, la solution à ce problème consiste à /usr/bin/pythonindiquer la bonne version de Python attendue par votre version d'Ubuntu (par exemple, en 16.04 était Python2.7 et en 18.04 était Python3.6).

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

La raison pour laquelle cela ne fonctionne pas est que, lors de l'utilisation update-alternatives, /usr/bin/python3pointe vers /etc/alternatives/python3, et il semble que ce ne soit pas exactement la même chose que de faire /usr/bin/python3remarquer /usr/bin/python3.6.

C'est pourquoi la solution à ce problème consiste souvent à cesser de gérer vos versions de Python3 avec update-alternativeset à /usr/bin/python3indiquer la bonne version de Python3 attendue par votre système.

Diego Pino
la source
/usr/bin/pythonn'existe pas sur une nouvelle installation de 18.04, mais c'est le cas si vous effectuez une mise à niveau au lieu d'une nouvelle installation ou installez le pythonpackage, auquel cas ce devrait être Python 2.7, et non 3.6. Voir PEP 394 .
wjandrea
Pour être clair, les différentes versions de Python ne sont pas des alternatives sur Ubuntu et ne doivent pas être gérées avec update-alternatives. C'est parce que le système d'exploitation repose sur une certaine version en cours d'installation.
wjandrea