Em /bin
, eu corri:
$ ls -l python3
lrwxrwxrwx 1 root root 10 Aug 8 01:44 python3 -> python3.12
$ python3 --version
Python 3.12.3
$ python3.12 --version
Python 3.12.5
Alguém pode explicar por que um é "Python 3.12.3 " e o outro é "Python 3.12.5 " quando eles são vinculados simbolicamente?
Para descobrir de onde eles estão fugindo, você pode usar:
EDIT : Como @muru mencionou, você deve usar
type
, pois é um comando integrado ao shell e compatível com POSIX:Quando você digita um comando, seu shell o procura em cada diretório do
$PATH
, na ordem listada, e executa o primeiro que encontrar.Por exemplo, se você digitar
zorglub
e seu$PATH
contém/usr/local/bin:/usr/bin:/bin
, então:/usr/local/bin/zorglub
existe e é executável. Se for o caso, ele executará isso e parará ali./usr/bin/zorglub
/bin/zorglub
Você pode verificar o valor
$PATH
digitando$PATH
é separado por dois pontos e é definido (e frequentemente adicionado) nos scripts de inicialização do seu shell.O resultado que você obtém (o que parece ser o mesmo comando retornando versões diferentes) significa que você provavelmente tem outro
python3
and/orpython3.12
em algum diretório diferente de/bin
, que é uma versão diferente daquela em/bin
. Os locais possíveis usuais podem incluir/usr/bin
,/usr/local/bin
,/opt/local/bin
, e muitos outros, dependendo do seu ambiente.Por exemplo, seu
$PATH
poderia ser definido como/usr/local/bin:/usr/bin:/bin
e/usr/local/bin
contém umpython3
que é (direta ou indiretamente) a versão 3.12.3, e como/usr/local/bin
é o primeiro,python3
sem qualificação executará aquele em vez do que aquele em/bin
. Por outro lado, sepython3.12
existe somente em/bin
, ele retornará para aquela versão, que é 3.12.5. Ou vice-versa.which python3
ewhich python3.12
lhe dirá qual deles é executado quando você digitapython3
epython3.12
, respectivamente.Se você quiser executar especificamente o
python3
oupython3.12
em/bin
, você precisa:/bin
, e execute./python3
ou./python3.12
(eles devem produzir o mesmo resultado, pois um é um link simbólico para o outro)/bin/python3
ou/bin/python3.12
python3
oupython3.12
em nenhum diretório listado antes/bin
em seu$PATH
.Quando você tem diferentes gerenciadores de pacotes, ou tem uma mistura de softwares instalados por gerenciadores de pacotes e via instalação manual, é infelizmente muito comum acabar com softwares instalados em locais diferentes, e isso pode causar todos os tipos de problemas, especialmente se um script Python executa outro script Python através do shell por algum motivo.
No caso do python (e muitos outros), isso é agravado pelo fato de que cada versão do executável pode usar um caminho diferente para pacotes python. Seu gerenciador de pacotes python (
pip
) também pode ter várias versões instaladas em locais diferentes e apontando para lugares diferentes. Ele pode rapidamente se tornar uma bagunça,pip install
dizendo que algo está instalado e atualizado enquantopython
diz que não está. É uma boa ideia certificar-se de que todas as versões dopython
foram instaladas pelos mesmos meios (seja pelo gerenciador de pacotes da sua distribuição ou pela instalação manual), não uma mistura dos dois.Se o seu código python3 começar com:
então seu código será executado automaticamente com python3.12.
Se você decidir atualizar para, digamos, python3.15, então tudo o que você precisa fazer é atualizar o link python3 para apontar para python3.15. Então todo o seu código estará executando 3.15.
Se você tiver problemas com a versão 3.15, você pode alterar o link de volta para a versão python3.12 conhecida como boa, sem precisar alterar nada do seu código.