Instalei a versão anterior (3.11.2) normalmente usando o gerenciador de pacotes apt e a versão posterior (3.12) manualmente a partir do código-fonte. Quando executo scripts python assim:
./python_script.py
O script usa a versão anterior em vez da posterior. Eu gostaria de deixar a linha shebang padrão #!/usr/bin/env python3
no início do script por motivos de portabilidade.
Aqui está um exemplo de script de teste.
#!/usr/bin/env python3
import sys
def main():
print(sys.version)
main()
EDIT: Com a configuração acima, estou pensando neste ponto que a solução mais rápida (provavelmente não a melhor por causa das consequências futuras, veja as respostas e comentários bem explicados da comunidade abaixo) é alterar o alvo do link simbólico python3 em / etc/alternatives para /usr/local/bin/python3.12 onde meu binário python3.12 está armazenado.
EDIT2: Como visto na segunda captura de tela, consegui ./myscript.py
usar a versão python que queria (3.12) verificando se o /usr/local/bin
diretório está antes do /usr/bin
diretório em minha PATH
variável de ambiente e renomeando o python3.12
binário /usr/local/bin/
para python3
.
Como você está usando
env python3
, a versão padrão do Python será determinada pela versão quepython3
estiver primeiro naPATH
variável. Você pode, portanto, escolher qual versão será usada construindo suaPATH
variável apropriadamente: se desejar o padrão do sistema, certifique-se de/usr/bin
que apareça antes de qualquer outro diretório que contenhapython3
, e se desejar sua própria construção do Python, certifique-se de que o diretório que contém essa versão depython3
apareça antes de/usr/bin
.A solução proposta é uma das piores que você poderia aplicar neste momento. Dada a situação mostrada na sua captura de tela, você ainda não quebrou seu sistema: os scripts Python do sistema, que especificam
#!/usr/bin/python3
em seu shebang, ainda podem encontrar os módulos que esperam. Se você mudar/usr/bin/python3
para Python 3.12, esses scripts perderão acesso aos módulos 3.11 instalados em seu sistema; em particular,python3-apt
. Isto pode ter consequências infelizes.Como você está especificando
#!/usr/bin/env python3
em seus próprios scripts e, portanto, pode confiar emPATH
, ainda acho que umaPATH
abordagem baseada em - é melhor em suas circunstâncias. Você pode até mudarPATH
em qualquer lugar, para apontar para opython3
primeiro, sem quebrar os scripts Python do sistema (já que eles não dependemPATH
para encontrar o Python).Para complementar a boa resposta de @StephenKitt , em sistemas baseados em Debian, você poderá instalar pacotes para mais de uma versão do python simultaneamente. Por exemplo, aqui no Ubuntu 22.04, tenho 3.10 e 3.11 instalados:
O
python3
pacote dependepython3.10
e opython3
executável é um link simbólico parapython3.10
.Não altere esse link simbólico manualmente.
python
as versões geralmente são incompatíveis entre si e os módulos python não são compartilhados entre as versões python, portanto, alterar o link simbólico do python3 quebrará os scripts que possuem um ou (#! /usr/bin/env python3
ou#! /usr/bin/python3
como#! /bin/python3
costuma/bin
ser um link simbólico/usr/bin
hoje em dia) e espera que o python3 seja 3.10 e tenha acesso aos módulos python instalados para 3.10.Portanto, se você precisar invocar um script que precise de uma versão instalada diferente do python e não puder alterar o shebang para
#! /usr/bin/python3.12
, basta invocá-lo como:Ou crie um:
E
~/.python3-is-python3.12
adiantado em seu$PATH
mas apenas para a invocação desse script , defini-lo globalmente provavelmente quebraria outros scripts que usam#! /usr/bin/env python3
e esperampython3
ser o padrão do sistemapython3
.Eu sei que esta pergunta é feita apenas sobre o
apt
gerenciador de pacotes, e as outras respostas cobrem muito bem esse aspecto.Mas se você estiver trabalhando com vários projetos python diferentes, todos exigindo versões python diferentes e/ou dependências diferentes, eu recomendo fortemente o uso de um ambiente virtual ( )
venv
para gerenciar as versões python e as dependências de seus projetos.Para instalar um ambiente virtual para um projeto, por exemplo, para 3.11, no diretório principal do projeto, execute:
Isso criará um diretório nomeado
venv
contendo o ambiente virtual.Então, para usar o ambiente, digite:
A partir daí, no shell atual você poderá rodar
python
epip
sem o número da versão, e será utilizado o ambiente correto. Para sair do ambiente, digitedeactivate
.No novo ambiente você terá apenas as
pip
dependências que instalou dentro dele, portanto não terá incompatibilidades de dependências entre projetos. Você também poderá criar facilmente orequirements.txt
arquivo para o projetopip freeze > requirements.txt
depois de instalar as dependências.Para todos os que votaram negativamente: como vocês podem ver na minha troca de comentários com Stephen, essa resposta requer mais trabalho. Não preciso de mais votos negativos para me convencer disso. Atualizarei/editarei/excluirei esta resposta assim que terminar minha pesquisa.
Como você está usando o Debian (ou um de seus derivados), considere usar o
update-alternatives
utilitário. Foi feito para situações como a sua - em que mais de uma versão do mesmo programa está instalada.Por exemplo, para definir o padrão para sua versão 3.12 residente em (por exemplo) /usr/local/bin/:
A resposta deve ser algo assim (na verdade, não instalei o Python 3.12):
Veja
man update-alternatives
para detalhes e outras opções.