"L'installazione di python3 è danneggiata"


13

Voglio aggiornare da Ubuntu 16.04.5 LTS a 18.04, quindi ho funzionato sudo do-release-upgrade. Dopo aver scaricato ed estratto bionic.tar.gzottengo:

Can not upgrade 

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

Ho visto Come risolvere "l'installazione di Python è danneggiata"? e così ho sudo ln -sf /usr/bin/python3.6 /usr/bin/python3pensato che sarebbe stato un problema simile. Ma questo non ha funzionato (sempre lo stesso messaggio di errore).

Ho alcune versioni di 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

Come posso risolvere python3?


1
E la reinstallazione (come indicato nella risposta accettata)?
Kulfy,

Risposte:


16

Devi usare la versione predefinita di Python 3 per 16.04. Questo è 3.5 , non 3.6. Quindi corri:

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

Se il problema persiste, prova a reinstallare il python3pacchetto.

sudo apt-get install --reinstall python3

A proposito, update-alternatives --display python3dovrebbe darti update-alternatives: error: no alternatives for python3. Diverse versioni di Python non sono alternative in Ubuntu.


32

Ho appena riscontrato questo problema su Pop! _OS 18.04, provando ad aggiornare a 18.10, e si scopre che il problema risiedeva nel link simbolico per /usr/bin/pythone non per /usr/bin/python3. Mi ero /usr/bin/python3.6configurato come un'alternativa a python(non python3), e quando l'ho modificato, ho potuto eseguire do-release-upgradecome previsto.

Vorrei che il messaggio di errore fosse indicato pythone non python3.


Prima, con il problema:

$ 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 

L'ho risolto in questo modo:

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

Vedi anche questo commento sotto che descrive una soluzione più precisa che spiega meglio cosa sta succedendo e come risolverlo.


1
Sì, posso confermare che la soluzione funziona, questa dovrebbe essere una risposta accettata.
Sumit Jain,

Questo ha funzionato anche per me
Efi Kaltirimidou,

3
Optare per questo è update-alternatives --remove-all pythonstato sicuramente un inutile sovraccarico: tutto ciò che dovevi fare era usare update-alternatives --config pythonper pythonindicare l'ultima python2.*(ad es. python2.7), Quindi utilizzare update-alternatives --config python3per avere un python3punto specifico python3.6 , che è la versione predefinita di Python 3 per 18.04.
KiriSakow,

2
Se è necessario eseguire l'aggiornamento a Python 3.7 in Ubuntu 18.04, non farlo per tutto il sistema - o sei destinato a finire con l'avere piccoli problemi fastidiosi modo generale con gli strumenti essenziali come gnome-terminal, update-managerecc Piuttosto utilizzare ambienti virtuali (documentazione qui e qui )
KiriSakow,

@Kiri Ci sono modi per installare altre versioni di Python senza sostituire quelle di sistema. Ad esempio usando il deadsnakes PPA .
wjandrea,

5

Ho osservato questo messaggio di errore su Windows 10 1903 con WSL Ubuntu quando volevo aggiornare da 16.04 LTS a 18.04 LTS .

Dopo do-release-upgradeaver fallito, ho cambiato pythonalternativa a ogni scelta offerta update-alternatives --config pythoned eseguito nuovamente il comando upgrade. Questo non ha aiutato.

Quindi ho controllato il file di registro /var/log/dist-upgrade/main.logche conteneva le righe

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

Quindi, sebbene il messaggio di errore menzioni python3 , il problema riguarda python2 .

Lo script di aggiornamento controlla il /usr/bin/pythoncollegamento a /usr/bin/python2, vedere il codice sorgente DistUpgrade/DistUpgradeController.pyqui: Ubuntu Launchpad

Quindi una soluzione è rimuovere completamente Python dal sistema alternativo e aggiungere manualmente il collegamento, come descritto nella risposta più popolare.

Se non vuoi rimuovere python dal sistema alternativo, cambia il collegamento solo per il tempo durante il processo di aggiornamento:

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

Questo ha funzionato per me.

Durante il processo di aggiornamento, il collegamento viene riparato automaticamente. Quindi, al termine dell'aggiornamento, punta alla voce Python nella directory delle alternative:

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

Modifica: per informazioni complete, il problema potrebbe apparire anche se si aggiorna da 18.04 LTS a 19.04 e la risposta si applica anche a questa situazione.


1
Nota: questa risposta si applica anche a un aggiornamento da Ubuntu 18.04 LTS a 19.04. L'ho provato io stesso dopo che l'aggiornamento a 18.04 era terminato con successo.
Daniel K.

3

Fondamentalmente la soluzione a questo problema consiste nel fare /usr/bin/pythonriferimento alla versione corretta di Python che la tua versione di Ubuntu si aspetta (ad esempio, in 16.04 era Python2.7 e in 18.04 era Python3.6).

Se nel tuo sistema sono installate diverse versioni di Python, potresti utilizzarle update-alternativesper gestirle. Non importa molto la tua alternativa predefinita per Python è la versione giusta che il tuo sistema si aspetta (3.6 in Ubuntu 18.04), non funzionerà.

Il motivo per cui questo non funziona è che, quando si utilizza update-alternatives, /usr/bin/python3punta a /etc/alternatives/python3, e sembra che non sia esattamente la stessa cosa a cui si fa /usr/bin/python3riferimento /usr/bin/python3.6.

Ecco perché la soluzione a questo problema consiste spesso nel interrompere la gestione delle versioni di Python3 update-alternativese fare /usr/bin/python3in modo che la versione corretta di Python3 si aspetti dal sistema.


/usr/bin/pythonnon esiste su un'installazione pulita di 18.04, ma lo fa se si esegue un aggiornamento anziché un'installazione pulita o si installa il pythonpacchetto, nel qual caso dovrebbe essere Python 2.7, non 3.6. Vedi PEP 394 .
wjandrea,

Per essere chiari, diverse versioni di Python non sono alternative su Ubuntu e non dovrebbero essere gestite con update-alternatives. Questo perché il sistema operativo si basa sull'installazione di una determinata versione.
wjandrea,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.