Aggiorna Python in virtualenv


206

C'è un modo per aggiornare la versione di Python utilizzata in un virtualenv (ad esempio se esce una versione bugfix)?

Potrei pip freeze --local > requirements.txt, quindi rimuovere la directory e pip install -r requirements.txt, ma questo richiede molta reinstallazione di librerie di grandi dimensioni, ad esempio numpy, che uso molto.

Vedo che questo è un vantaggio durante l'aggiornamento da, ad esempio, 2.6 -> 2.7, ma per quanto riguarda 2.7.x -> 2.7.y?


2
Mentre potresti essere in grado di modificare alcuni percorsi, ecc. Per farlo funzionare. L'ultima cosa che desideri è un ambiente leggermente diverso dalla produzione. Pensa solo .. se c'è anche una differenza tra la compilazione delle varie versioni, perderai tutto il tempo risparmiato rintracciando il bug. Mi prenderei solo il tempo per creare un nuovissimo virtualenv e reinstallare tutto.
Sam Dolan,

@Simon Walker. Esattamente lo stesso problema. Devo aggiornare Python 3.5.3 per una correzione di bug.
Mohammed Shareef C

Risposte:


77

Hai visto questo ? Se non ho frainteso quella risposta, potresti provare a creare un nuovo virtual sopra quello vecchio. Devi solo sapere quale python utilizzerà il tuo virtualenv (dovrai vedere la tua versione di virtualenv).

Se virtualenv è installato con la stessa versione di Python di quella precedente e l'aggiornamento del pacchetto virtualenv non è un'opzione, potresti voler leggere questo per installare un virtualenv con la versione di Python che desideri.

MODIFICARE

Ho testato questo approccio (quello che crea un nuovo virtual sopra quello vecchio) e ha funzionato bene per me. Penso che potresti avere dei problemi se passi da python 2.6 a 2.7 o da 2.7 a 3.x ma se esegui l'aggiornamento all'interno della stessa versione (rimanendo alla 2.7 come vuoi) non dovresti avere alcun problema, come tutti i pacchetti sono contenuti nelle stesse cartelle per entrambe le versioni di Python (i pacchetti 2.7.xe 2.7.y si trovano in your_env / lib / python2.7 /).

Se cambi la tua versione di virtualenv python, dovrai installare nuovamente tutti i tuoi pacchetti per quella versione (o semplicemente collegare i pacchetti necessari nella cartella dei pacchetti della nuova versione, ovvero: your_env / lib / python_newversion / site-pacchetti)


13
In particolare, non voleva reinstallare alcun pacchetto, se possibile. Ovviamente non hai mai installato numpy dal sorgente se non sai perché è importante;) suggerimento: ci vuole un tempo LOOOOOOOOOOOOOONG.
Antti Haapala,

sì, lo capisco. Ma sembra che se fa un virtualenv in cima all'altro, i pacchetti non vanno persi, quindi non dovrà reinstallare numpy o qualsiasi altro pacchetto. Tuttavia, penso che dovrebbe provarlo in una nuova virtualenv nel caso fallisca.
marianobianchi,

Riposo il mio caso, credo che le nuove versioni di virtualenv si aggiornino davvero sul posto, tuttavia per le vecchie versioni, non hanno nemmeno sovrascritto l'eseguibile python, il che ha causato problemi con almeno una versione bugfix di python.
Antti Haapala,

4
Non ha funzionato per me e sembra che non dovrebbe: github.com/pypa/virtualenv/issues/437
Kentzo,

1
Ho cercato di creare un nuovo virtualenvsulla parte superiore del vecchio, e ha fatto il lavoro. Ho dovuto specificare -pdi puntarlo alla giusta versione di Python.
osa,

76

Se ti capita di usare il modulo venv fornito con Python 3.3+, supporta --upgradeun'opzione. Secondo i documenti :

Aggiorna la directory di ambiente per utilizzare questa versione di Python, supponendo che Python sia stato aggiornato sul posto

python3 -m venv --upgrade ENV_DIR

1
Sfortunatamente, questo non funziona su Ubuntu 16.04, dove si sono rotti venve si rifiutano di risolverlo sulla base del fatto che "potresti usare virtualenv". EDIT: in realtà, funziona! Mostra anche un messaggio di errore su "surepip".
rspeer,

2
Ho aggiornato Python dalla 3.5.1 alla 3.6.4 sul mio sistema. E per aggiornare python sul mio virtualenv, ho dovuto menzionare esplicitamente python3.6 nel comando:python3.6 -m venv --upgrade <path_of_existing_env>
Sarfraaz Ahmed

1
Nel mio caso, bin/pythone bin/python3ancora collegato al vecchio python3.4binario, e ho dovuto impostare i collegamenti manualmente. Inoltre, c'è un modo per rimuovere la versione di Python ormai obsoleta?
Jens,

4
Ho Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.> cosa significa? Non vedo alcun processo Python attivo, impossibile aggiornarlo.
user305883

1
@ user305883 Ho riscontrato un errore simile dopo aver aggiornato la versione di Python del sistema da 3.5 a 3.6 (e rimosso 3.5). Ho dovuto reinstallare 3.5 ed eseguire python3.6 -m venv --upgrade ENV_DIRper farlo funzionare. Penso che dovrò ancora aggiornare alcuni collegamenti simbolici in ENV_DIR/bin. Quindi, il trucco era aggiornare con la nuova versione di Python mentre la versione precedente era ancora installata.
AstroFloyd,

24

Aggiornato di nuovo: il seguente metodo potrebbe non funzionare nelle versioni più recenti di virtualenv. Prima di provare a apportare modifiche alla vecchia virtualenv, è necessario salvare le dipendenze in un file di requisiti (pip freeze > requirements.txt) ed effettuare un backup da qualche altra parte. Se qualcosa va storto, puoi comunque creare un nuovo virtualenv e installare le vecchie dipendenze (pip install -r requirements.txt).

Aggiornato: ho modificato la risposta 5 mesi dopo la risposta iniziale. Il seguente metodo è più conveniente e robusto.

Effetto collaterale: corregge anche l'Symbol not found: _SSLv2_methodeccezione quando si faimport sslin un ambiente virtuale dopo aver aggiornato Python alla v2.7.8.

Avviso: Attualmente, questo è per Python solo 2.7.x .


Se stai usando Homebrew Python su OS X, prima deactivatetutto virtualenv, quindi aggiorna Python:

brew update && brew upgrade python

Esegui i seguenti comandi ( <EXISTING_ENV_PATH>è il percorso del tuo ambiente virtuale):

cd <EXISTING_ENV_PATH>
rm .Python
rm bin/pip{,2,2.7}
rm bin/python{,2,2.7}
rm -r include/python2.7
rm lib/python2.7/*
rm -r lib/python2.7/distutils
rm lib/python2.7/site-packages/easy_install.*
rm -r lib/python2.7/site-packages/pip
rm -r lib/python2.7/site-packages/pip-*.dist-info
rm -r lib/python2.7/site-packages/setuptools
rm -r lib/python2.7/site-packages/setuptools-*.dist-info

Infine, ricrea il tuo ambiente virtuale:

virtualenv <EXISTING_ENV_PATH>

In questo modo, i vecchi file core di Python e le librerie standard (più setuptoolse pip) vengono rimossi, mentre le librerie personalizzate installate site-packagesvengono mantenute e funzionanti, non appena sono in Python puro. Potrebbe essere necessario reinstallare le librerie binarie per funzionare correttamente.

Questo ha funzionato per me su 5 ambienti virtuali con Django installato.

A proposito, se ./manage.py compilemessagesdopo non funziona, prova questo:

brew install gettext && brew link gettext --force

L'unico file che ho dovuto eliminare era il bin/pythonfile.
Koen.

Per alcune versioni precedenti di Python, è necessario eliminare setuptoolsed pipè necessario.
Rockallite,

1
Ho anche dovuto eliminare <EXISTING_ENV_PATH>/.Pythonpoiché ciò ha interrotto la creazione di virtualenv.
Kiran Jonnalagadda,

2
Sulla base di questa risposta ho scritto una piccola sceneggiatura (con piena attribuzione): burgundywall.com/post/update-all-python-virtual-environments
Kurt,

Puoi effettivamente rimuovere facilmente il tuo ambiente virtuale eseguendo rmvirtualenv <env_name>e rimuoverai tutte le sue dipendenze allineate :) Vedi di più su: virtualenvwrapper.readthedocs.io/it/latest/…
Nick Lucas

7

Non sono stato in grado di creare un nuovo virtual sopra quello vecchio. Ma ci sono strumenti in pip che rendono molto più veloce la reinstallazione dei requisiti in una nuova venv. Pip può compilare ciascuno degli elementi nel vostro requisito.txt in un pacchetto ruota e archiviarlo in una cache locale. Quando crei una nuova venv ed esegui pip install in essa, pip userà automaticamente le ruote prefabbricate se le trova. Le ruote si installano molto più velocemente dell'esecuzione di setup.py per ciascun modulo.

Il mio ~ / .pip / pip.conf è simile al seguente:

[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/

[wheel]
wheel-dir = /Users/me/.pip/wheels

Installo wheel ( pip install wheel), quindi corro pip wheel -r requirements.txt. Questo memorizza le ruote costruite nella dir-ruota nel mio pip.conf.

Da quel momento in poi, ogni volta che installo uno di questi requisiti, li installa dalle ruote, il che è piuttosto veloce.


1
Per la maggior parte delle persone penso che fare uso delle macchine pip per fare il lavoro abbia senso, ma per chiunque abbia personalizzato le proprie virtualità post-attivazione, pre-attivazione, ecc., Questa non è un'opzione desiderabile perché tutto ciò che è perso e deve essere preparato manualmente.
dpwrussell,

6

Come aggiornare la versione di Python per un progetto virtualenvwrapper esistente e mantenere lo stesso nome

Sto aggiungendo una risposta a chiunque utilizzi l'eccellente virtualenvwrapper di Doug Hellmann in particolare perché le risposte esistenti non mi hanno fatto.

Qualche contesto:

  • Lavoro su alcuni progetti che sono Python 2 e alcuni che sono Python 3; mentre mi piacerebbe usare python3 -m venv, non supporta gli ambienti Python 2
  • Quando avvio un nuovo progetto, utilizzo quello mkprojectche crea l'ambiente virtuale, crea una directory di progetto vuota e ci contiene CD
  • Voglio continuare a usare il workoncomando virtualenvwrapper per attivare qualsiasi progetto indipendentemente dalla versione di Python

Indicazioni:

Supponiamo che il tuo progetto esistente abbia un nome fooe che attualmente stia eseguendo Python 2 ( mkproject -p python2 foo), sebbene i comandi siano gli stessi se si aggiorna da 2.xa 3.x, da 3.6.0 a 3.6.1, ecc. sei attualmente all'interno dell'ambiente virtuale attivato.

1. Disattiva e rimuovi il vecchio ambiente virtuale:

$ deactivate
$ rmvirtualenv foo

Nota che se hai aggiunto comandi personalizzati agli hook (ad es., bin/postactivate) Dovrai salvarli prima di rimuovere l'ambiente.

2. Riponi il progetto reale in una directory temporanea:

$ cd ..
$ mv foo foo-tmp

3. Creare il nuovo ambiente virtuale (e la directory di progetto) e attivare:

$ mkproject -p python3 foo

4. Sostituisci la directory del progetto generata vuota con il progetto reale, cambia di nuovo nella directory del progetto:

$ cd ..
$ mv -f foo-tmp foo
$ cdproject

5. Reinstallare le dipendenze, confermare la nuova versione di Python, ecc.:

$ pip install -r requirements.txt
$ python --version

Se questo è un caso d'uso comune, prenderò in considerazione l'apertura di un PR per aggiungere qualcosa come $ upgradevirtualenv/ $ upgradeprojecta virtualenvwrapper.


1
Sì grazie. Sono arrivato a metà strada e ho avuto grossi problemi ... Un controllo sarebbe carino perché il primo passo è irreversibile una volta cancellato (per quanto ne
so al momento

2

Questo approccio funziona sempre per me:

# First of all, delete all broken links. Replace  my_project_name` to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It's it. Just repeat for each virtualenv located in ~/.virtualenvs

Preso da:


1

Ho spostato la mia directory home da un mac a un altro (Mountain Lion a Yosemite) e non mi sono reso conto della virtualenv rotta finché non ho perso il vecchio laptop. Ho avuto il punto virtualenv su Python 2.7 installato brewe da quando Yosemite è arrivato con Python 2.7, volevo aggiornare il mio virtualenv al sistema Python. Quando correvo virtualenvin cima alla directory esistente, stavo ricevendo un OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'errore. Per tentativi ed errori, ho risolto questo problema rimuovendo alcuni collegamenti e correggendone alcuni manualmente. Questo è quello che ho finalmente fatto (simile a quello che ha fatto @Rockalite, ma più semplice):

cd <virtualenv-root>
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm include/python2.7
rm .Python
cd lib/python2.7
gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done

Dopo questo, sono stato in grado di eseguire virtualenv in cima alla directory esistente.


1

Su OS X o macOS, usando Homebrew per installare e aggiornare Python3, prima dovevo eliminare i collegamenti simbolici python -m venv --upgrade ENV_DIR che funzionasse.

Ho salvato quanto segue in upgrade_python3.sh in modo da ricordare quanti mesi a partire da quando dovrò farlo di nuovo:

brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;

AGGIORNAMENTO: sebbene all'inizio sembrasse funzionare bene, quando ho eseguito py.test ha dato un errore. Alla fine ho appena ricreato l'ambiente da un file di requisiti.


py.testnon funziona perché `~ / .virtualenvs / myenv / bin / python3.7 non è un collegamento simbolico, quindi non viene aggiornato.
Ash Berlin-Taylor,

Ah in realtà, il problema è ~/.virtualenvs/myenv/.Pythonche c'è un link simbolico.
Ash Berlin-Taylor,

1

Se stai usando pipenv, non so se sia possibile aggiornare un ambiente sul posto, ma almeno per gli aggiornamenti di versione minori sembra essere abbastanza intelligente da non ricostruire i pacchetti da zero quando crea un nuovo ambiente. Ad esempio, da 3.6.4 a 3.6.5:

$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a virtualenv for this project
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv
Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 47/47  00:00:24
To activate this project's virtualenv, run the following:
 $ pipenv shell
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
. /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
bash-3.2$ . /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
(autoscale-aBUhewiD) bash-3.2$ python
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>>

eccezionale! Grazie per questo gioiello
Mayur Patil,

1

Voglio solo chiarire, perché alcune delle risposte si riferiscono venve altre si riferisconovirtualenv .

L'uso del flag -po --pythonè supportato su virtualenv, ma non su venv. Se hai più di una versione di Python e vuoi specificare con quale creare creare venv, fallo sulla riga di comando, in questo modo:

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

Ovviamente puoi aggiornare con venvcome altri hanno sottolineato, ma ciò presuppone che tu abbia già aggiornato Python che è stato usato per crearlo venvin primo luogo. Non puoi eseguire l'aggiornamento a una versione di Python che non hai già sul tuo sistema da qualche parte, quindi assicurati di ottenere la versione che desideri, prima di tutto, quindi fai tutti i venv che vuoi da essa.


1

Passaggio 1: congelare i requisiti e eseguire il backup di env esistente

pip freeze > requirements.txt
deactivate
mv env env_old

Passaggio 2: installare Python 3.7 e attivare l'ambiente virutal

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

Passaggio 3: installare i requisiti

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt

0

Per tutti i problemi

Errore: il comando '[' / Users / me / Sites / site / venv3 / bin / python3 ',' -Im ',' surepip ',' --upgrade ',' --default-pip ']' ha restituito un valore diverso da zero stato di uscita 1.

Devi installare python3.6-venv

 sudo apt-get install python3.6-venv
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.