Recebemos muitas perguntas aqui sobre pessoas que mexeram com as versões do Python e arruinaram seus sistemas, principalmente sobre o fato de o apt não funcionar corretamente. Estou ciente de que muitos pacotes do Ubuntu requerem versões específicas do Python para funcionar corretamente.
Minha pergunta é: o que torna uma versão mais recente/diferente do Python incompatível com o apt? Esses pacotes dependem de recursos de linguagem que existem apenas em determinadas versões ou de quais recursos específicos do Python apt dependem que o fazem funcionar apenas com uma versão específica do Python?
Sim, geralmente são recursos de linguagem específicos que existem apenas em uma determinada versão do Python.
Dependendo do problema, você frequentemente receberá um erro quando um aplicativo como o apt ou, mais provavelmente, o dpkg solicita algo usando a sintaxe errada que não existe na versão mais recente.
No entanto, o apt em si não depende do python e o mesmo é verdade para o dpkg - mas os pacotes que dependem do python geralmente têm scripts de pré e pós-instalação que invocam scripts python ou python.
Por exemplo, se você baixar o arquivo deb para
software-properties-gtk
, extraia esse arquivo e, em seguida, extraia ocontrol.tar.xz
arquivo, você verá umprerm
script.O script é um script sh, mas você pode ver que ele também chama python:
Então
py3clean
, faz partepython3-minimal
e este script é chamadopython3
no shebang na primeira linha do arquivo, conforme visto nos seguintes comandos:e isso deve mostrar
/usr/bin/py3clean
assim:saída:
Isso é importante porque um arquivo real para
/usr/bin/python3
não existe, como você pode ver pelo seguinte comando:Em 20.04, isso me diz que
/usr/bin/python3
é um link simbólico para python3.8 ewhich python3.8
mostra que esse arquivo é/usr/bin/python3.8
. Além disso,file /usr/bin/python3.8
confirma que este é o executável Python real usado para python3.Portanto, o
software-properties-gtk
pacote espera que, se o python3 estiver instalado, a versão do python3 instalada seja python3.8.O
py3clean
script pode ou não funcionar com uma versão diferente do python, mas geralmente há alterações suficientes no python que provavelmente há pelo menos uma alteração em algum lugar desse script que causaria algum tipo de erro.Mesmo que não fosse por esta situação em particular, você entendeu.
Acho que, para resumir, isso não é realmente um problema com o apt, mas sim um problema de python porque os scripts python geralmente usam um shebang genérico que espera uma versão específica do python quando o shebang especifica ou ou mesmo ou como nenhum
/usr/bin/python
desses/usr/bin/python3
aponta/usr/bin/env python
para/usr/bin/env python3
um arquivo real, todos eles apontam para um link simbólico que aponta para sua versão padrão do python instalada no sistema.Como a maioria dos pacotes é lançada para uma versão específica do Ubuntu, todos esperam que a versão padrão do Python seja a mesma. Caso contrário, cada pacote dependeria de uma versão do Python arbitrariamente diferente e podemos acabar com 3 ou mais versões do Python instaladas no mesmo sistema apenas para satisfazer as dependências.
Normalmente, se você deseja ou precisa de uma versão diferente do Python instalada, é porque você tem um motivo específico. E não há nada que o impeça de usar uma versão diferente do Python por esse motivo, desde que você não mexa com a versão padrão do python que outros softwares usam quando chamam
python
oupython3
.Portanto, se você instalar uma versão alternativa, não terá a conveniência de chamar essa versão alternativa de
python
oupython3
como sua versão padrão — você precisará especificar a versão especificamente chamandopython3.9
, por exemplo, ao usá-la.Acho que devo adicionar como um aviso para outras pessoas que estão lendo esta resposta. Se você deseja instalar uma versão diferente do python em seu sistema, pergunte para encontrar a maneira correta de fazê-lo. É possível ter várias versões do Python em um sistema, mas para evitar problemas, você não deve desinstalar, alterar ou alterar de forma alguma a versão padrão do Python. Mas não acho que entrar em mais detalhes estaria dentro do escopo desta questão.