AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 760615
Accepted
siralbert
siralbert
Asked: 2023-11-04 20:22:27 +0800 CST2023-11-04 20:22:27 +0800 CST 2023-11-04 20:22:27 +0800 CST

Se eu tiver duas versões do python3 instaladas em minha máquina (ou seja: 3.11.2 e 3.12), como defino a versão padrão a ser usada ao executar scripts python?

  • 772

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 python3no 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()

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

EDIT2: Como visto na segunda captura de tela, consegui ./myscript.pyusar a versão python que queria (3.12) verificando se o /usr/local/bindiretório está antes do /usr/bindiretório em minha PATHvariável de ambiente e renomeando o python3.12binário /usr/local/bin/para python3.

apt
  • 4 4 respostas
  • 2177 Views

4 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2023-11-04T21:25:54+08:002023-11-04T21:25:54+08:00

    Como você está usando env python3, a versão padrão do Python será determinada pela versão que python3estiver primeiro na PATHvariável. Você pode, portanto, escolher qual versão será usada construindo sua PATHvariável apropriadamente: se desejar o padrão do sistema, certifique-se de /usr/binque apareça antes de qualquer outro diretório que contenha python3, e se desejar sua própria construção do Python, certifique-se de que o diretório que contém essa versão de python3apareç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/python3em seu shebang, ainda podem encontrar os módulos que esperam. Se você mudar /usr/bin/python3para 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 python3em seus próprios scripts e, portanto, pode confiar em PATH, ainda acho que uma PATHabordagem baseada em - é melhor em suas circunstâncias. Você pode até mudar PATHem qualquer lugar, para apontar para o python3primeiro, sem quebrar os scripts Python do sistema (já que eles não dependem PATHpara encontrar o Python).

    • 16
  2. Stéphane Chazelas
    2023-11-05T01:45:10+08:002023-11-05T01:45:10+08:00

    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:

    $ aptitude search -F%p '~i ~n "^python[0-9.]*$"'
    python3
    python3.10
    python3.11
    

    O python3pacote depende python3.10e o python3executável é um link simbólico para python3.10.

    $ zstat +link --  ${(v)commands[(I)python[0-9.]#]}
    /usr/bin/python3 python3.10
    /usr/bin/python3.10
    /usr/bin/python3.11
    

    Não altere esse link simbólico manualmente. pythonas 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 python3ou #! /usr/bin/python3como #! /bin/python3costuma /binser um link simbólico /usr/binhoje 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:

    python3.12 /path/to/that-file.py
    

    Ou crie um:

    mkdir ~/.python3-is-python3.12
    ln -s /usr/bin/python3.12 ~/.python3-is-python3.12/python3
    

    E ~/.python3-is-python3.12adiantado em seu $PATH mas apenas para a invocação desse script , defini-lo globalmente provavelmente quebraria outros scripts que usam #! /usr/bin/env python3e esperam python3ser o padrão do sistema python3.

    • 10
  3. user000001
    2023-11-06T03:34:19+08:002023-11-06T03:34:19+08:00

    Eu sei que esta pergunta é feita apenas sobre o aptgerenciador 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 ( ) venvpara 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:

    python3.11 -m venv venv
    

    Isso criará um diretório nomeado venvcontendo o ambiente virtual.

    Então, para usar o ambiente, digite:

    . venv/bin/activate
    

    A partir daí, no shell atual você poderá rodar pythone pipsem o número da versão, e será utilizado o ambiente correto. Para sair do ambiente, digite deactivate.

    No novo ambiente você terá apenas as pipdependências que instalou dentro dele, portanto não terá incompatibilidades de dependências entre projetos. Você também poderá criar facilmente o requirements.txtarquivo para o projeto pip freeze > requirements.txtdepois de instalar as dependências.

    • 9
  4. Seamus
    2023-11-06T03:25:27+08:002023-11-06T03:25:27+08:00

    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-alternativesutilitá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/:

    sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.12 10
    

    A resposta deve ser algo assim (na verdade, não instalei o Python 3.12):

    update-alternatives: using /usr/local/bin/python3.12 to provide /usr/bin/python3 (python3) in auto mode
    

    Veja man update-alternativespara detalhes e outras opções.

    • -2

relate perguntas

  • O que procurar ao misturar software em diferentes versões de uma distribuição?

  • Entendendo a saída da lista apt

  • Tentar instalar o pacote debian npm faz com que o apt-get remova o libssl-dev

  • Como baixar o pacote não instalá-lo com o comando apt-get?

  • Qual é o benefício de /etc/apt/sources.list.d sobre /etc/apt/sources.list

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve