Qual è il modo corretto di gestire più versioni di Python?


21

Ho una macchina con Python 2.6 installato come Python predefinito. Quindi, ho installato Python 2.7 e creato manualmente / usr / bin / python come collegamento simbolico alla nuova installazione.

Quindi, ho riscontrato problemi con il comando non trovato . Sto provando a reinstallarlo:

sudo apt-get remove command-not-found

e ottengo questo errore:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6

Ma voglio davvero che Python 2.7 sia l'impostazione predefinita. Come posso risolvere questo casino?

Risposte:


16

Cambiare Python (o Perl, ecc.) Predefinito su un sistema operativo è davvero una cattiva idea. Questo interprete fa effettivamente parte del sistema operativo e potrebbero esserci altri componenti del sistema operativo scritti appositamente per funzionare con quella versione dell'interprete.

Ad esempio su Redhat lo strumento yum che esegue gli aggiornamenti del software di sistema è un'applicazione Python. Davvero non vuoi romperlo. Tali applicazioni potrebbero dipendere dall'installazione di moduli python specifici, forse non standard, che potrebbe non avere la versione installata. Ad esempio su Ubuntu credo che alcuni degli strumenti OS integrati scritti in Python utilizzino un ORM chiamato Storm che non fa parte della libreria standard di Python. La tua installazione pulita di Python 2.7 ha installata la versione prevista prevista del modulo Storm? Ha qualche versione di Storm? No? Quindi hai appena rotto un pezzo del tuo sistema operativo.

Il modo giusto per farlo è installare la tua versione preferita di Python e configurare il tuo account utente per usarlo configurando il tuo .bash_profile, percorso e così via. Potresti anche voler esaminare il modulo virtualenv per Python.


1
Ho cercato su Google qui. -1 se avessi il rappresentante su questo stack. Perché? Perché l'approccio suggerito dice solo "installa la tua versione preferita di Python". Come si fa senza eliminare il pitone di sistema?
jez,

@jez Gli utenti devono fare riferimento alle istruzioni di installazione per la loro applicazione e combinazione di SO scelta. In generale, i pacchetti di installazione in lingua verranno installati in una posizione benigna, non sovrascrivere i componenti del sistema operativo principale, quindi il caso speciale sarebbe sovrascrivere la versione del sistema operativo.
Simon Hibbs,

8

Come posso risolvere questo casino?

Nient'altro che la reinstallazione python. Annullerà la modifica (il link simbolico).

Perché lo vuoi come predefinito? Ogni volta che ne hai bisogno, usa python2.7o includi #!/usr/bin/python2.7(lo shebang) all'inizio dei tuoi script (eseguibili).

Se insisti ad avere python2.7un valore predefinito a livello di sistema, usa una versione successiva di Ubuntu (attualmente Ubuntu 11.04, nome in codice Natty). Usa quella versione come predefinita.

In futuro, evita di fare interventi manuali come quello che hai fatto con il collegamento simbolico. Ciò è particolarmente vero per i file gestiti dalla distro e, soprattutto, per gli animali complessi come le installazioni di Python.


Ho pensato che fosse ragionevole cambiare l'installazione di Python predefinita solo dopo aver effettuato l'aggiornamento. Lo voglio come predefinito perché voglio lavorare con il più recente Python ... come predefinito. Quando pythonscrivo da bash, voglio ottenere il nuovo pitone. C'è un modo migliore per farlo rispetto a quello che ho fatto?
ripper234,

Solo per notare - non penso che ci fosse qualcosa di sbagliato nel modo in cui ho installato Python 2.7. L'unica mossa "non ortodossa" stava cambiando il collegamento simbolico, che pensavo fosse il modo corretto di impostarlo come predefinito. C'è un modo migliore?
ripper234,

2
@ripper: immagino che arriverò a questa discussione un po 'tardi. Come dice Tshepang, il pythonpacchetto su Ubuntu determina la versione del sistema. Ora è possibile personalizzare l'installazione in modo che python 2.7 sia predefinito creando il proprio pacchetto python ecc., Ma in tal caso, diventerai effettivamente manutentore della tua installazione Python invece di Ubuntu e dovrai imparare come Python è gestito su Debian / Ubuntu. Tieni presente che gli altri pacchetti Python nel sistema sono configurati per funzionare con 2.6 come impostazione predefinita, quindi, a parte qualsiasi altra cosa, potrebbe verificarsi la rottura.
Faheem Mitha,

1
@Tshepang: buon riassunto!
Faheem Mitha,

12
@ ripper234: non modificare nulla /usr/bin, riservato alla tua distribuzione. Invece, crea /usr/local/bin/pythonun collegamento simbolico a python2.7. Quindi gli script che usano #!/usr/bin/env python(l'idioma consigliato), oltre a digitare pythonsulla riga di comando, eseguiranno Python 2.7. Gli script della distribuzione che desiderano Python dalla distribuzione possono continuare a chiamare #!/usr/bin/python.
Gilles 'SO-smetti di essere malvagio' il

2

Disclaimer: ho appena pubblicato la stessa risposta allo stack overflow:

/programming/2812520/pip-dealing-with-multiple-python-versions/50319252

Ecco la mia opinione sul problema. Funziona per Python3. Le caratteristiche principali sono:

  • Ogni versione di Python è compilata dal sorgente
  • Tutte le versioni sono installate localmente
  • Non altera in alcun modo l'installazione Python predefinita del sistema
  • Ogni versione di Python è isolata con virtualenv

I passi sono come segue:

  1. Se hai installato diverse versioni di Python in qualche altro modo, eliminale , ad esempio rimuovi $ HOME / .local / lib / python3.x , ecc. (Anche quelle installate a livello globale). Tuttavia, non toccare la versione python3 predefinita del sistema.

  2. Scarica l'origine per diverse versioni di Python nella seguente struttura di directory:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. In ogni directory "Python-3.xy /", procedi come segue ( NON utilizzare "sudo" in nessuno dei passaggi!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. In "python_versions /" crea file come questo:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Ora, ogni volta che desideri optare per python3.x, fallo

    source $HOME/python_versions/env_python3x.bash

    per inserire virtualenv

  6. Mentre sei in virtualenv, installa i tuoi pacchetti python preferiti con

    pip install --upgrade package_name
  7. Per uscire dalla versione di virtualenv e python basta digitare "disattivare"


0

Abbiamo messo molte distribuzioni Python su Mac e Ubuntu molto e qui sono le mie raccomandazioni.

  1. Lascia il sistema Python non molestato: non usarlo mai.

  2. Se hai bisogno solo di una distribuzione primaria di Python, scarica e installa Canopy dall'interesse. Quando viene installato, scegli "imposta come mio pitone di sistema", quindi puoi installare i pacchetti dal gestore dei pacchetti della GUI di Canopy.

    • Canopy è anche pronto all'uso con pipil comando di gestione pacchetti PyPi che consente di installare pacchetti (ad es. pip install python-twitter)
  3. Se hai intenzione di utilizzare ambienti virtuali (ovvero stai sviluppando programmi Python e desideri un ambiente Python pulito dedicato per ciascuno, con un modo semplice per passare da uno all'altro), consiglierei Anaconda su Canopy per il suo strumento di gestione dell'ambiente virtuale . Questo ti permetterà

0

pyenv

https://github.com/pyenv/pyenv

Pyenv ti consente di gestire più versioni di Python senza sudo per un singolo utente, proprio come Node.js NVM e Ruby RVM .

Installa Pyenv:

curl https://pyenv.run | bash

Quindi aggiungi al tuo .bashrc:

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Trova la versione di Python da installare:

pyenv install --list

Installa la versione di Python che desideri:

# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
  libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
  xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

Elenco versioni disponibili di Python:

pyenv versions

Ora abbiamo:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

Seleziona una versione di Python diversa:

pyenv global 3.8.0
python --version
python3 --version

Entrambe le uscite:

Python 3.8.0

Ora possiamo procedere con l'installazione e l'uso dei pacchetti normalmente:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

Possiamo confermare che tutto è installato localmente nel nostro ambiente pulito con:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

Per utilizzo del progetto

Nella sezione precedente, abbiamo visto come utilizzare pyenv in una configurazione globale.

Tuttavia, ciò che di solito si desidera impostare una versione specifica di pacchetto e python in base al progetto. Così è come si fa.

Innanzitutto installa la versione di Python desiderata come prima.

Quindi, dall'interno della directory del progetto, imposta la versione di Python desiderata con:

pyenv local 3.8.0

che crea un file .python-versioncontenente la stringa di versione.

E ora installiamo un pacchetto localmente solo per il nostro progetto: TODO: non c'è niente di bello a quanto pare: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Ora, quando qualcuno vuole usare il tuo progetto, farà:

pyenv local

che imposta la versione di Python su quella corretta.

Discussioni correlate:

Testato su Ubuntu 18.04, pyenv 1.2.15.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.