Duas versões do python no linux. como fazer 2.7 o padrão

124

Eu tenho duas versões do python no meu linuxbox:

$python
Python 2.6.6 (r266:84292, Jul 10 2013, 22:48:45) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 


$ /usr/local/bin/python2.7
Python 2.7.3 (default, Oct  8 2013, 15:53:09) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 

$ which python
/usr/bin/python
$ ls -al /usr/bin/python
-rwxr-xr-x. 2 root root 4864 Jul 10 22:49 /usr/bin/python

Como faço para que o 2.7 seja a versão padrão e, quando digito, pythonele me coloca no 2.7?

Anthony
fonte
1
Quando fiz isso no meu fedora, o yum ou o apt-get não funcionaram mais.
Utilizador
@ Usuário: Sim, eu quebrei um Mandrake antigo da mesma forma (mudar /usr/bin/env pythonpara 2.6, em vez de 2.3, significava metade dos comandos rpme todos urpmipararam de funcionar).
abarnert
Eu segui a seguinte etapa para instalar o Django no Centos 5: 1º, instale o Python 3.6 a partir do código fonte. 2º: no shell, digite o seguinte comando "alias python = / usr / local / bin / python3.6" 3º: execute o seguinte comando para instalar o Django "pip3 instale o Django" 4º: "python -m django --version" para verificar o Django instalado com a versão "1.10.5"
showmyroutes
para mim /usr/bin/pythonera um link suave apontando para python2. Eu apenas mudei parapython3.6
munish

Respostas:

173

Você provavelmente não deseja alterar seu Python padrão.

Sua distribuição instalou um sistema padrão no Python /usr/bine pode ter scripts que dependem disso, sendo selecionados por #! /usr/bin/env python. Geralmente, você pode se safar da execução de scripts Python 2.6 na 2.7, mas deseja arriscar?

Além disso, o manuseio /usr/binpode prejudicar a capacidade do gerente de pacotes de gerenciar pacotes. E alterar a ordem dos diretórios no seu diretório PATHafetará muitas outras coisas além do Python. (De fato, é mais comum ter /usr/local/binà frente /usr/bin, e pode ser o que você realmente deseja - mas se você tiver o contrário, provavelmente há uma boa razão para isso.)

Mas você não precisa alterar o Python padrão para que o sistema execute 2.7 quando você digita python.


Primeiro, você pode configurar um alias de shell:

alias python=/usr/local/bin/python2.7

Digite isso em um prompt ou coloque-o no seu ~/.bashrcse quiser que a alteração seja persistente e agora, quando você digita python, executa o 2.7 escolhido, mas quando algum programa em seu sistema tenta executar um script com /usr/bin/env pythono padrão 2.6.


Como alternativa, basta criar um ambiente virtual a partir do seu 2.7 (ou venvs separados para diferentes projetos) e fazer seu trabalho dentro do venv.

abarnert
fonte
1
:( você está certo. infelizmente, eu já havia criado um novo link symb de acordo com a resposta do @ rohit. Agora, meu yumcomando não funciona! Tentei criar o link sym de volta, mas ele não funciona em sudo ln -sf /usr/bin/python2.6 /usr/bin/pythonnenhuma solução alternativa?
Anthony
@ Anthony: Meu palpite é que /usr/bin/pythonna verdade não era um link simbólico antes, era um script de wrapper ou executável, e agora você o substituiu e não pode recuperá-lo. Se rpmainda estiver funcionando, você pode baixar manualmente o pacote Python e instalá-lo sem yum.
abarnert
Ainda consigo chegar ao intérprete 2.6 quando digito, python2.6para que ele ainda esteja lá.
Anthony
7
@ Anthony: E no futuro, se alguém lhe disser para mudar as coisas em / usr / bin (ou em qualquer lugar em / usr além de / usr / local), anote o que está lá e faça um backup ...
abarnert
que bagunça ruim eu me meti !! Eu tenho outra caixa de centos que pode ter esse script. Se eu copiá-lo de lá e colocá-lo em / usr / bin desta caixa. você acha que vai funcionar?
Anthony
19

Adicione /usr/local/binà sua PATHvariável de ambiente, anteriormente na lista que /usr/bin.

Geralmente isso é feito no arquivo rc do seu shell, por exemplo, para o bash, você coloca isso em .bashrc:

export PATH="/usr/local/bin:$PATH"

Isso fará com que o seu shell procure primeiro um pythonin /usr/local/bin, antes de ir com o in /usr/bin.

(Obviamente, isso significa que você também precisa /usr/local/bin/pythonapontar python2.7- se ainda não o tiver, precisará vincular novamente).

Âmbar
fonte
Possivelmente, pode ser necessário configurar o PYTHONHOME adequadamente / desabilitar se for definido por algo.
Marcin
1
Isso não é tão perigoso quanto as soluções que sugerem mudar o / usr / bin ... mas ainda acho que não é o que o OP realmente deseja.
abarnert
Isso me ajudou após a atualização do Ubuntu 14.x para 16.x
learn2day 19/16/16
4

Digite o comando

which python

//output:
/usr/bin/python

cd /usr/bin
ls -l

Aqui você pode ver algo como isto

lrwxrwxrwx 1 root   root            9 Mar  7 17:04  python -> python2.7

seu python2.7 padrão está vinculado ao texto 'python'

Portanto, remova o python softlink

sudo rm -r python

tente novamente o comando acima

ls -l

você pode ver que o softlink foi removido

-rwxr-xr-x 1 root   root      3670448 Nov 12 20:01  python2.7

Em seguida, crie um novo softlink para python3.6

ln -s /usr/bin/python3.6 python

Em seguida, tente o comando pythonno terminal

//output:
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux

Digite help, copyright, creditsou licensepara mais informações.

Sreenath
fonte
1
Sua postagem não é uma resposta para a pergunta do OP.
31519 Frank
Isso resolveu um problema muito estranho para mim. Quando eu verifico a versão python do terminal raiz ou normal, ele mostra 3.6.8, mas se eu criar um .sh e digitar python -version inside, isso imprimirá 2.7. Acontece que foi porque existia um softlink conforme mencionado acima. Seguiu os passos e está consertado. Obrigado.
S4nd33p
Obrigado! Isso me resolveu o problema do "exigido python 3 ou posterior"
Tamim Attafi
4

Verifique a versão atual do python:

$ python --version

então verifique python é o link simbólico para qual arquivo.

  $ ll /usr/bin/python

Saída Ex:

 lrwxrwxrwx 1 root root 9 Jun 16  2014 /usr/bin/python -> python2.7*

Verifique outras versões disponíveis do python:

$ ls /usr/bin/python*

Saída Ex:

/usr/bin/python     /usr/bin/python2.7-config  /usr/bin/python3.4         /usr/bin/python3.4m-config  /usr/bin/python3.6m         /usr/bin/python3m
/usr/bin/python2    /usr/bin/python2-config    /usr/bin/python3.4-config  /usr/bin/python3.6          /usr/bin/python3.6m-config  /usr/bin/python3m-config
/usr/bin/python2.7  /usr/bin/python3           /usr/bin/python3.4m        /usr/bin/python3.6-config   /usr/bin/python3-config     /usr/bin/python-config

Se quiser alterar a versão atual do python para a versão 3.6, edite o arquivo ~ / .bashrc:

vim ~/.bashrc

adicione a linha abaixo no final do arquivo e salve:

alias python=/usr/local/bin/python3.6

Para instalar o pip para python 3.6

$ sudo apt-get install python3.6 python3.6-dev
$ sudo curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python3.6
$ sudo easy_install pip

Em Sucesso, verifique a versão atual do pip:

$ pip3 -V

Saída Ex:

pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.6)
Shiv Buyya
fonte
2

Todo o sistema operacional vem com uma versão padrão do python e reside em / usr / bin. Todos os scripts que acompanham o sistema operacional (por exemplo, yum) apontam para esta versão do python que reside em / usr / bin. Quando você deseja instalar uma nova versão do python, não deseja interromper os scripts existentes que podem não funcionar com a nova versão do python.

A maneira correta de fazer isso é instalar o python como uma versão alternativa.

e.g.
wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2 
tar xf Python-2.7.3.tar.bz2
cd Python-2.7.3
./configure --prefix=/usr/local/
make && make altinstall

Agora, fazendo isso, os scripts existentes como o yum ainda funcionam com / usr / bin / python. e sua versão python padrão seria a instalada em / usr / local / bin. ou seja, quando você digita python, você obtém 2.7.3

Isso acontece porque. A variável $ PATH possui / usr / local / bin antes de usr / bin.

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

Se o python2.7 ainda não tiver efeito como a versão padrão do python, você precisará fazer

export PATH="/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
Prakash Kamath
fonte
-8

Eu acho que você instalou a versão 2.7 manualmente, enquanto 2.6 vem de um pacote?

A resposta simples é: desinstalar o pacote python.

O mais complexo é: não instale manualmente em / usr / local. Crie um pacote com a versão 2.7 e depois atualize.

O manuseio de pacotes depende da distribuição usada.

emesik
fonte
5
O pacote Python é quase certamente requerido pela distribuição. O CentOS é baseado em RPM, e metade das ferramentas RPM e YUM são escritas em Python.
abarnert
Caro Michael, Por favor, informe a opção de desinstalar o python2.7 instalado manualmente!
AVA
A solução simples seria remover tudo em / usr / local /, mas desta forma você removerá tudo o que você compilou e instalou manualmente. Não há uma boa maneira de rastrear quais arquivos pertencem a qual software em / usr / local e, por esse motivo, instalar qualquer coisa geralmente é desencorajado. Talvez você tenha apenas python lá. Se / usr / local / bin contiver apenas executáveis ​​python, você terá uma boa chance de a remoção não quebrar mais nada.
emesik
2
Você nunca deve desinstalar o python. Tira isso de mim. Eu fiz isso e ele quebrou meu sistema. Muitos aplicativos dependem disso. Isso é muito desaconselhável.
Patrick Mutwiri 12/04