“Sua instalação do python3 está corrompida”

13

Quero atualizar do Ubuntu 16.04.5 LTS para 18.04, então executei sudo do-release-upgrade. Depois de baixar e extrair bionic.tar.gz, recebo:

Can not upgrade 

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

Eu vi como corrigir "a instalação do python está corrompida"? e por isso sudo ln -sf /usr/bin/python3.6 /usr/bin/python3pensei que seria um problema semelhante. Mas isso não funcionou (ainda a mesma mensagem de erro).

Eu tenho algumas versões 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

Como faço para corrigir python3?

mRcSchwering
fonte
11
E a reinstalação (como mencionado na resposta aceita)?
Kulfy

Respostas:

14

Você precisa usar a versão padrão do Python 3 para 16.04. Isso é 3,5 , não 3,6. Então corra:

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

Se isso não funcionar, tente reinstalar o python3pacote.

sudo apt-get install --reinstall python3

By the way, update-alternatives --display python3deve dar-lhe update-alternatives: error: no alternatives for python3. Versões diferentes do Python não são alternativas no Ubuntu.

wjandrea
fonte
32

Acabei de encontrar esse problema no Pop! _OS 18.04, tentando atualizar para o 18.10, e acontece que o problema estava no link simbólico para /usr/bin/pythone não para /usr/bin/python3. Eu tinha /usr/bin/python3.6configurado como alternativa para python(não python3) e, quando mudei isso, poderia executar do-release-upgradeconforme o esperado.

Desejo que a mensagem de erro seja apontada pythone não python3.


Antes, com o 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 

Corrigi da seguinte maneira:

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

Veja também este comentário abaixo, que descreve uma solução mais precisa que também explica melhor o que está acontecendo e como corrigi-lo.

JB Rainsberger
fonte
11
Sim, posso confirmar que a solução funciona, essa resposta deve ser aceita.
Sumit Jain
Isso funcionou para mim também
Efi Kaltirimidou 21/19/19
3
Optando por update-alternatives --remove-all pythonfoi definitivamente um exagero desnecessário: Tudo o que você precisava fazer era usar update-alternatives --config pythona ter pythonponto para o mais recente python2.*(por exemplo python2.7), então use update-alternatives --config python3a ter python3ponto para especificamente python3.6 - que é o padrão Python 3 versão para 18,04.
precisa saber é o seguinte
2
Se você precisa atualizar para python 3.7 no Ubuntu 18.04, não fazê-lo em todo o sistema - ou você é obrigado a acabar tendo problemas pouco desagradável em todo o sistema com ferramentas essenciais, como gnome-terminal, update-manager, etc. Em vez disso usar ambientes virtuais (documentação aqui e aqui )
KiriSakow 9/06/19
@Kiri Existem maneiras de instalar outras versões do Python sem substituir o (s) sistema (s). Por exemplo, usando o PPA deadsnakes .
Wjandrea
5

Observei essa mensagem de erro no Windows 10 1903 executando o WSL Ubuntu quando eu queria atualizar do 16.04 LTS para o 18.04 LTS .

Depois de do-release-upgradeter falhado, troquei pythonalternativas para todas as opções oferecidas update-alternatives --config pythone executei o comando upgrade novamente. Isso não ajudou.

Então eu verifiquei o arquivo de log /var/log/dist-upgrade/main.logque continha as linhas

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

Portanto, embora a mensagem de erro mencione python3 , o problema é sobre python2 .

O script de atualização verifica se há /usr/bin/pythonlinks para /usr/bin/python2, veja o código-fonte DistUpgrade/DistUpgradeController.pyaqui: ubuntu launchpad

Portanto, uma solução é remover completamente o python do sistema alternativo e adicionar o link manualmente, conforme descrito na resposta mais popular.

Se você não deseja remover o python do sistema alternativo, basta alterar o link apenas durante o processo de atualização:

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

Isso funcionou para mim.

Durante o processo de atualização, o link é reparado automaticamente. Portanto, quando a atualização estiver concluída, ela aponta para a entrada python no diretório de alternativas:

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

Editar: para obter informações completas, o problema também pode aparecer se você atualizar do 18.04 LTS para o 19.04 e a resposta também se aplicar a essa situação.

Daniel K.
fonte
11
Nota: Esta resposta também se aplica a uma atualização do Ubuntu 18.04 LTS para 19.04. Eu mesmo tentei depois que a atualização para o 18.04 foi concluída com êxito.
Daniel K.
3

Basicamente, a solução para esse problema consiste em /usr/bin/pythonapontar para a versão correta do Python que sua versão do Ubuntu espera (por exemplo, no 16.04 era Python2.7 e no 18.04 era Python3.6).

Se você possui várias versões do Python instaladas no seu sistema, pode estar usando update-alternativespara gerenciá-las. Não importa muito que sua alternativa padrão para Python seja a versão correta que seu sistema espera (3.6 no Ubuntu 18.04), não funcionará.

A razão pela qual isso não funciona é que, ao usar update-alternatives, /usr/bin/python3aponta para /etc/alternatives/python3, e parece que não é exatamente o mesmo que /usr/bin/python3apontar para /usr/bin/python3.6.

É por isso que a solução para esse problema geralmente consiste em parar de gerenciar as versões do Python3 update-alternativese /usr/bin/python3apontar para a versão correta do Python3 que seu sistema espera.

Diego Pino
fonte
/usr/bin/pythonnão existe em uma instalação limpa da 18.04, mas existe se você fizer uma atualização em vez de uma instalação limpa ou instalar o pythonpacote; nesse caso, deve ser Python 2.7, não 3.6. Ver PEP 394 .
Wjandrea
Para ficar claro, versões diferentes do Python não são alternativas no Ubuntu e não devem ser gerenciadas com update-alternatives. Isso ocorre porque o sistema operacional depende de uma determinada versão sendo instalada.
Wjandrea