„Twoja instalacja python3 jest uszkodzona”

13

Chcę uaktualnić z Ubuntu 16.04.5 LTS do 18.04, więc uruchomiłem sudo do-release-upgrade. Po pobraniu i rozpakowaniu bionic.tar.gzotrzymuję:

Can not upgrade 

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

Widziałem, jak naprawić „instalacja Pythona jest uszkodzona”? i sudo ln -sf /usr/bin/python3.6 /usr/bin/python3pomyślałem, że będzie to podobny problem. Ale to nie działało (wciąż ten sam komunikat o błędzie).

Mam kilka wersji Pythona:

$ 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

Jak to naprawić python3?

mRcSchwering
źródło
1
A co z ponowną instalacją (jak wspomniano w zaakceptowanej odpowiedzi)?
Kulfy

Odpowiedzi:

16

Musisz użyć domyślnej wersji Python 3 dla 16.04. To 3,5 , a nie 3,6. Więc uruchom:

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

Jeśli to nie zadziała, spróbuj ponownie zainstalować python3pakiet.

sudo apt-get install --reinstall python3

Nawiasem mówiąc, update-alternatives --display python3powinienem ci dać update-alternatives: error: no alternatives for python3. Różne wersje Pythona nie są alternatywą dla Ubuntu.

wjandrea
źródło
32

Właśnie natknąłem się na ten problem na Pop! _OS 18.04, próbując uaktualnić do 18.10, i okazuje się, że problem tkwi w dowiązaniu symbolicznym dla, /usr/bin/pythona nie dla /usr/bin/python3. Miałem /usr/bin/python3.6skonfigurowany jako alternatywa dla python(nie python3), a kiedy to zmieniła, wtedy mogę działać do-release-upgradezgodnie z oczekiwaniami.

Chciałbym, aby komunikat o błędzie wskazywał, pythona nie wskazywał python3.


Przedtem z problemem:

$ 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 

Naprawiłem to w ten sposób:

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

Zobacz także ten komentarz poniżej, który opisuje bardziej precyzyjne rozwiązanie, które lepiej wyjaśnia, co się dzieje i jak to naprawić.

JB Rainsberger
źródło
1
Tak, mogę potwierdzić, że rozwiązanie działa, należy zaakceptować odpowiedź.
Sumit Jain
To również działało dla mnie
Efi Kaltirimidou
3
Decydując się na update-alternatives --remove-all pythonzdecydowanie niepotrzebna przesada: Wszystko, co potrzebne do zrobienia używał update-alternatives --config pythonmieć pythonpunkt do najnowszych python2.*(na przykład python2.7), a następnie użyć update-alternatives --config python3mieć python3wskaż konkretnie python3.6 - co jest domyślne Python 3 wersja 18.04.
KiriSakow
2
Jeśli trzeba uaktualnić do Pythona 3.7 w Ubuntu 18.04, nie rób to systemowy - czy jesteś zobowiązany skończyć się paskudne małe problemy systemowy z podstawowymi narzędziami podoba gnome-terminal, update-manageritp raczej używać wirtualnych środowisk (dokumentacja tutaj i tutaj )
KiriSakow
@Kiri Istnieją sposoby na zainstalowanie innych wersji Pythona bez konieczności zamiany wersji systemowej. Na przykład za pomocą PPA deadsnakes .
wjandrea
5

Zauważyłem ten komunikat o błędzie w systemie Windows 10 1903 z uruchomionym WSL Ubuntu, gdy chciałem uaktualnić z 16.04 LTS do 18.04 LTS .

Po tym, do-release-upgradejak zawiodło, zamieniłem pythonalternatywy na wszystkie opcje oferowane przez update-alternatives --config pythoni ponownie uruchomiłem polecenie aktualizacji. To nie pomogło.

Następnie sprawdziłem plik dziennika /var/log/dist-upgrade/main.logzawierający linie

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

Więc chociaż komunikat o błędzie wspomina o python3 , problem dotyczy python2 .

Skrypt aktualizacji sprawdza /usr/bin/pythonpołączenie z /usr/bin/python2, zobacz kod źródłowy DistUpgrade/DistUpgradeController.pytutaj: starter Ubuntu

Jednym z rozwiązań jest całkowite usunięcie Pythona z alternatywnego systemu i ręczne dodanie linku, jak opisano w najpopularniejszej odpowiedzi.

Jeśli nie chcesz usuwać Pythona z alternatywnego systemu, po prostu zmień łącze tylko na czas podczas procesu aktualizacji:

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

To zadziałało dla mnie.

Podczas procesu aktualizacji łącze jest automatycznie naprawiane. Kiedy aktualizacja zostanie zakończona, wskazuje na pozycję python w katalogu alternatyw:

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

Edycja: w celu uzyskania dokładnych informacji problem może pojawić się również w przypadku aktualizacji z 18.04 LTS do 19.04, a odpowiedź dotyczy również tej sytuacji.

Daniel K.
źródło
1
Uwaga: ta odpowiedź dotyczy także aktualizacji z Ubuntu 18.04 LTS do 19.04. Próbowałem sam po tym, jak aktualizacja 18.04 zakończyła się pomyślnie.
Daniel K.
3

Zasadniczo rozwiązanie tego problemu polega na /usr/bin/pythonwskazaniu właściwej wersji Pythona, której oczekuje Twoja wersja Ubuntu (na przykład w 16.04 było Python2.7, a w 18.04 było Python3.6).

Jeśli masz kilka wersji Pythona zainstalowanych w systemie, być może używasz ich update-alternativesdo zarządzania. Nie ma znaczenia, że ​​domyślną alternatywą dla Pythona jest odpowiednia wersja, jakiej oczekuje Twój system (3.6 w Ubuntu 18.04), to nie będzie działać.

Powodem, dla którego to nie działa jest to, że podczas używania update-alternatives, /usr/bin/python3wskazuje /etc/alternatives/python3, i wydaje się, że nie jest to dokładnie to samo co /usr/bin/python3wskaż /usr/bin/python3.6.

Dlatego rozwiązanie tego problemu często polega na zaprzestaniu zarządzania wersjami Python3 update-alternativesi /usr/bin/python3wskazaniu właściwej wersji Python3, której oczekuje Twój system.

Diego Pino
źródło
/usr/bin/pythonnie istnieje w czystej instalacji 18.04, ale dzieje się tak, jeśli wykonasz aktualizację zamiast czystej instalacji lub zainstalujesz pythonpakiet, w takim przypadku powinien to być Python 2.7, a nie 3.6. Zobacz PEP 394 .
wjandrea
Żeby było jasne, różne wersje Pythona nie są alternatywą dla Ubuntu i nie należy nimi zarządzać update-alternatives. Wynika to z faktu, że system operacyjny zależy od zainstalowania określonej wersji.
wjandrea