"Su instalación de python3 está dañada"

13

Quiero actualizar de Ubuntu 16.04.5 LTS a 18.04, así que corrí sudo do-release-upgrade. Después de descargar y extraer bionic.tar.gzobtengo:

Can not upgrade 

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

Vi ¿Cómo arreglar "la instalación de Python está dañada"? y entonces sudo ln -sf /usr/bin/python3.6 /usr/bin/python3pensé que sería un problema similar. Pero eso no funcionó (sigue siendo el mismo mensaje de error).

Tengo algunas versiones 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

¿Cómo lo soluciono python3?

mRcSchwering
fuente
1
¿Y qué pasa con la reinstalación (como se menciona en la respuesta aceptada)?
Kulfy

Respuestas:

15

Debe usar la versión predeterminada de Python 3 para 16.04. Eso es 3.5 , no 3.6. Entonces corre:

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

Si eso no funciona, intente reinstalar el python3paquete.

sudo apt-get install --reinstall python3

Por cierto, update-alternatives --display python3debería darte update-alternatives: error: no alternatives for python3. Las diferentes versiones de Python no son alternativas en Ubuntu.

wjandrea
fuente
32

Me encontré con este problema en Pop! _OS 18.04, tratando de actualizar a 18.10, y resulta que el problema estaba en el enlace simbólico para /usr/bin/pythony no para /usr/bin/python3. Me había /usr/bin/python3.6configurado como una alternativa para python(no python3), y cuando cambié esto, pude ejecutar do-release-upgradecomo se esperaba.

Deseo que el mensaje de error apunte pythony no python3.


Antes, con el 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 

Lo arreglé de esta manera:

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

También vea este comentario a continuación que describe una solución más precisa que también explica mejor lo que está sucediendo y cómo solucionarlo.

JB Rainsberger
fuente
1
Sí, puedo confirmar que la solución funciona, esta respuesta debe aceptarse.
Sumit Jain
Esto también funcionó para mí
Efi Kaltirimidou
3
Optar por update-alternatives --remove-all pythonera definitivamente una exageración innecesaria: todo lo que tenía que hacer era usar update-alternatives --config pythonpara tener el pythonpunto más reciente python2.*(por ejemplo python2.7), luego usar update-alternatives --config python3para tener un python3punto específico python3.6 , que es la versión predeterminada de Python 3 para 18.04.
KiriSakow
2
Si necesita actualizar a Python 3.7 en Ubuntu 18.04, no lo haga en todo el sistema - o que está obligado a llegar a tener pequeños problemas desagradables en todo el sistema con las herramientas esenciales como gnome-terminal, update-manager, etc. Más bien utilizar entornos virtuales (documentación aquí y aquí )
KiriSakow
@Kiri Hay formas de instalar otras versiones de Python sin reemplazar las del sistema. Por ejemplo, usando el PPA de denaws .
wjandrea
5

Observé este mensaje de error en Windows 10 1903 ejecutando WSL Ubuntu cuando quería actualizar de 16.04 LTS a 18.04 LTS .

Después de do-release-upgradehaber fallado, cambié las pythonalternativas a cada opción ofrecida por update-alternatives --config pythony ejecuté el comando de actualización nuevamente. Eso no ayudó.

Luego revisé el archivo de registro /var/log/dist-upgrade/main.logque contenía las líneas

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

Entonces, aunque el mensaje de error menciona python3 , el problema es sobre python2 .

El script de actualización verifica la /usr/bin/pythonvinculación a /usr/bin/python2, vea el código fuente de DistUpgrade/DistUpgradeController.pyaquí: ubuntu launchpad

Entonces, una solución es eliminar completamente Python del sistema alternativo y agregar el enlace manualmente, como se describe en la respuesta más popular.

Si no desea eliminar Python del sistema alternativo, simplemente cambie el enlace solo por el tiempo durante el proceso de actualización:

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

Esto funcionó para mí.

Durante el proceso de actualización, el enlace se repara automáticamente. Entonces, cuando finaliza la actualización, apunta a la entrada de Python en el directorio de alternativas:

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

Editar: para obtener información detallada, el problema también puede aparecer si actualiza de 18.04 LTS a 19.04 y la respuesta también se aplica a esta situación.

Daniel K.
fuente
1
Nota: Esta respuesta también se aplica a una actualización de Ubuntu 18.04 LTS a 19.04. Lo intenté yo mismo después de que la actualización a 18.04 hubiera terminado con éxito.
Daniel K.
3

Básicamente, la solución a este problema consiste en /usr/bin/pythonseñalar la versión correcta de Python que su versión de Ubuntu espera (por ejemplo, en 16.04 era Python2.7 y en 18.04 era Python3.6).

Si tiene varias versiones de Python instaladas en su sistema, podría estar utilizándolas update-alternativespara administrarlas. No importa mucho, su alternativa predeterminada para Python es la versión correcta que su sistema espera (3.6 en Ubuntu 18.04), no funcionará.

La razón por la que esto no funciona es que, cuando se usa update-alternatives, /usr/bin/python3apunta a /etc/alternatives/python3, y parece que eso no es exactamente lo mismo que /usr/bin/python3señalar /usr/bin/python3.6.

Es por eso que la solución a este problema a menudo consiste en dejar de administrar sus versiones de Python3 update-alternativesy /usr/bin/python3señalar la versión correcta de Python3 que su sistema espera.

Diego Pino
fuente
/usr/bin/pythonno existe en una instalación limpia de 18.04, pero sí si realiza una actualización en lugar de una instalación limpia o instala el pythonpaquete, en cuyo caso debería ser Python 2.7, no 3.6. Ver PEP 394 .
wjandrea
Para ser claros, las diferentes versiones de Python no son alternativas en Ubuntu y no se deben administrar con update-alternatives. Esto se debe a que el sistema operativo depende de la instalación de una determinada versión.
wjandrea