Aktualisieren Sie Python in einer virtuellen Umgebung

205

Gibt es eine Möglichkeit, die in einer virtuellen Umgebung verwendete Python-Version zu aktualisieren (z. B. wenn eine Bugfix-Version herauskommt)?

Ich könnte pip freeze --local > requirements.txtdann das Verzeichnis entfernen und pip install -r requirements.txt, aber dies erfordert zum Beispiel eine große Neuinstallation großer Bibliotheken numpy, die ich häufig benutze.

Ich kann sehen, dass dies ein Vorteil beim Upgrade von z. B. 2.6 -> 2.7 ist, aber was ist mit 2.7.x -> 2.7.y?

Simon Walker
quelle
2
Möglicherweise können Sie einige Pfade usw. ändern, damit es funktioniert. Das Letzte, was Sie wollen, ist eine etwas andere Umgebung als die Produktion. Denken Sie nur daran, wenn es nur einen Unterschied zwischen der Kompilierung der verschiedenen Versionen gibt, verlieren Sie die Zeit, die Sie durch das Aufspüren des Fehlers sparen. Ich würde mir einfach die Zeit nehmen, eine brandneue virtuelle Umgebung zu erstellen und alles neu zu installieren.
Sam Dolan
@ Simon Walker. Genau das gleiche Problem. Ich muss Python 3.5.3 für eine Fehlerbehebung aktualisieren.
Mohammed Shareef C

Antworten:

77

Hast du das ? Wenn ich diese Antwort nicht falsch verstanden habe, können Sie versuchen, eine neue virtuelle Umgebung über der alten zu erstellen. Sie müssen nur wissen, welcher Python Ihre virtualenv verwenden wird (Sie müssen Ihre virtualenv-Version sehen).

Wenn Ihr virtualenv mit derselben Python-Version wie das alte installiert ist und ein Upgrade Ihres virtualenv-Pakets nicht möglich ist, können Sie dies lesen , um ein virtualenv mit der gewünschten Python-Version zu installieren.

BEARBEITEN

Ich habe diesen Ansatz getestet (der, der eine neue virtuelle Umgebung über der alten erstellt), und er hat für mich gut funktioniert. Ich denke, Sie können einige Probleme haben, wenn Sie von Python 2.6 auf 2.7 oder 2.7 auf 3.x wechseln, aber wenn Sie nur innerhalb derselben Version aktualisieren (bei 2.7 bleiben, wie Sie möchten), sollten Sie kein Problem haben, da alle Pakete werden für beide Python-Versionen in denselben Ordnern gespeichert (2.7.x- und 2.7.y-Pakete befinden sich in your_env / lib / python2.7 /).

Wenn Sie Ihre Virtualenv-Python-Version ändern, müssen Sie alle Ihre Pakete für diese Version erneut installieren (oder verknüpfen Sie einfach die benötigten Pakete mit dem Ordner für die neuen Versionspakete, dh: your_env / lib / python_newversion / site-packages).

Marianobianchi
quelle
13
Er wollte ausdrücklich keine Pakete neu installieren, wenn dies möglich war. Offensichtlich haben Sie numpy nie von der Quelle installiert, wenn Sie nicht wissen, warum es wichtig ist;) Hinweis: Es dauert eine LOOOOOOOOOOOOOONG-Zeit.
Antti Haapala
Ja, das verstehe ich. Es scheint jedoch, dass Pakete nicht verloren gehen, wenn er eine virtuelle Umgebung übereinander erstellt, sodass er numpy oder ein anderes Paket nicht neu installieren muss. Trotzdem denke ich, dass er dies in einer neuen virtuellen Umgebung versuchen sollte, falls es fehlschlägt.
Marianobianchi
Ich ruhe meinen Fall aus, ich glaube, dass die neuen virtualenv-Versionen tatsächlich aktualisiert werden, aber für alte Versionen haben sie nicht einmal die ausführbare Python-Datei überschrieben, was Probleme mit mindestens einer Python-Bugfix-Version verursachte.
Antti Haapala
4
Es hat bei mir nicht funktioniert und es sieht so aus, als ob es nicht funktionieren sollte: github.com/pypa/virtualenv/issues/437
Kentzo
1
Ich habe versucht, ein neues virtualenvüber dem alten zu erstellen , und es hat funktioniert. Ich musste angeben -p, um auf die richtige Version von Python zu verweisen.
osa
76

Wenn Sie zufällig das mit Python 3.3+ gelieferte venv-Modul verwenden, wird eine --upgradeOption unterstützt . Gemäß den Dokumenten :

Aktualisieren Sie das Umgebungsverzeichnis, um diese Version von Python zu verwenden, vorausgesetzt, Python wurde direkt aktualisiert

python3 -m venv --upgrade ENV_DIR
CoupleWavyLines
quelle
1
Leider funktioniert dies nicht unter Ubuntu 16.04, wo sie kaputt gingen venvund sich weigerten, es auf der Grundlage zu reparieren, dass "Sie einfach virtualenv verwenden könnten". EDIT: Eigentlich funktioniert es! Es wird nur eine Fehlermeldung zu "surepip" angezeigt.
rspeer
2
Ich habe Python auf meinem System von 3.5.1 auf 3.6.4 aktualisiert. Und um Python auf meiner virtuellen Umgebung zu aktualisieren, musste ich Python3.6 im Befehl explizit erwähnen:python3.6 -m venv --upgrade <path_of_existing_env>
Sarfraaz Ahmed
1
In meinem Fall bin/pythonund bin/python3immer noch mit der alten python3.4Binärdatei verknüpft, musste ich die Verknüpfungen manuell einstellen. Gibt es auch eine Möglichkeit , die jetzt veraltete Python-Version zu entfernen ?
Jens
4
Ich habe Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.> was bedeutet das? Ich sehe keine aktiven Python-Prozesse, kann nicht aktualisieren.
user305883
1
@ user305883 Ich habe einen ähnlichen Fehler erhalten, nachdem ich meine Python-Systemversion von 3.5 auf 3.6 aktualisiert (und 3.5 entfernt) habe. Ich musste 3.5 neu installieren und ausführen, python3.6 -m venv --upgrade ENV_DIRdamit es funktioniert. Ich denke, ich muss noch einige symbolische Links in aktualisieren ENV_DIR/bin. Daher bestand der Trick darin, mit der neuen Python-Version zu aktualisieren, während die alte Version noch installiert war.
AstroFloyd
24

Erneut aktualisiert: Die folgende Methode funktioniert möglicherweise nicht in neueren Versionen von virtualenv. Bevor Sie versuchen, Änderungen an der alten virtuellen Umgebung vorzunehmen, sollten Sie die Abhängigkeiten in einer Anforderungsdatei (pip freeze > requirements.txt)speichernund an einer anderen Stelle sichern. Wenn etwas schief geht, können Sie trotzdem eine neue virtuelle Umgebung erstellen und die alten Abhängigkeiten darin installieren (pip install -r requirements.txt).

Aktualisiert: Ich habe die Antwort 5 Monate nach meiner ursprünglichen Antwort geändert. Die folgende Methode ist bequemer und robuster.

Nebeneffekt: Es behebt auch dieSymbol not found: _SSLv2_methodAusnahme, wenn Sie diesimport sslin einer virtuellen Umgebung nach dem Upgrade von Python auf Version 2.7.8 tun.

Hinweis: Derzeit ist dies für Python 2.7.x nur .


Wenn Sie Homebrew Python unter OS X verwenden, zuerst deactivatealle virtuellen Geräte und dann Python aktualisieren:

brew update && brew upgrade python

Führen Sie die folgenden Befehle aus ( <EXISTING_ENV_PATH>ist der Pfad Ihrer virtuellen Umgebung):

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

Erstellen Sie abschließend Ihre virtuelle Umgebung neu:

virtualenv <EXISTING_ENV_PATH>

Auf diese Weise werden alte Python-Kerndateien und Standardbibliotheken (plus setuptoolsund pip) entfernt, während die in installierten benutzerdefinierten Bibliotheken site-packageserhalten bleiben und funktionieren, sobald sie in reinem Python vorliegen. Binäre Bibliotheken müssen möglicherweise neu installiert werden, damit sie ordnungsgemäß funktionieren.

Dies funktionierte für mich in 5 virtuellen Umgebungen mit installiertem Django.

Übrigens, wenn ./manage.py compilemessageses danach nicht funktioniert, versuchen Sie Folgendes:

brew install gettext && brew link gettext --force
Rockallite
quelle
Die einzige Datei, die ich löschen musste, war die bin/pythonDatei.
Koen.
Bei einigen älteren Python-Versionen ist das Löschen setuptoolsund piperforderlich.
Rockallite
1
Ich musste auch löschen, <EXISTING_ENV_PATH>/.Pythonda dies die Erstellung von virtualenv brach.
Kiran Jonnalagadda
2
Basierend auf dieser Antwort schrieb ich ein kleines Skript (mit vollständiger Zuordnung): burgundywall.com/post/update-all-python-virtual-environments
Kurt
Sie können Ihre virtuelle Umgebung tatsächlich einfach entfernen, indem Sie sie ausführen , rmvirtualenv <env_name>und alle damit verbundenen Abhängigkeiten entfernen :) Weitere Informationen finden Sie unter
Nick Lucas
7

Ich konnte keine neue virtuelle Umgebung über der alten erstellen. Es gibt jedoch Tools in Pip, mit denen sich die Anforderungen in einem brandneuen Venv viel schneller wieder installieren lassen. Pip kann jedes der Elemente in Ihrer Anforderung.txt in ein Radpaket einbauen und in einem lokalen Cache speichern. Wenn Sie ein neues venv erstellen und pip install darin ausführen, verwendet pip automatisch die vorgefertigten Räder, wenn es sie findet. Die Räder werden für jedes Modul viel schneller installiert als die Ausführung von setup.py.

Meine ~ / .pip / pip.conf sieht folgendermaßen aus:

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

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

Ich installiere Wheel ( pip install wheel) und renne dann pip wheel -r requirements.txt. Dadurch werden die gebauten Räder im Radverzeichnis in meiner pip.conf gespeichert.

Von da an werden diese Anforderungen jedes Mal, wenn ich sie installiere, von den Rädern aus installiert, was ziemlich schnell geht.

Russ Egan
quelle
1
Für die meisten Leute ist es meiner Meinung nach sinnvoll, Pip-Maschinen für die Arbeit zu verwenden, aber für alle, die ihre virtuellen Umgebungen nachaktiviert, voraktiviert usw. haben, ist dies keine wünschenswerte Option, da alles verloren geht und manuell neu gelesen werden muss.
dpwrussell
6

So aktualisieren Sie die Python-Version für ein vorhandenes virtualenvwrapper-Projekt und behalten den gleichen Namen bei

Ich füge eine Antwort für jeden hinzu, der Doug Hellmanns hervorragenden virtuellen Envwrapper verwendet, insbesondere weil die vorhandenen Antworten dies nicht für mich getan haben.

Ein Kontext:

  • Ich arbeite an einigen Projekten, die Python 2 sind, und an einigen, die Python 3 sind. Ich würde es gerne verwenden python3 -m venv, aber es unterstützt keine Python 2-Umgebungen
  • Wenn ich ein neues Projekt mkprojectstarte , verwende ich, das die virtuelle Umgebung erstellt, ein leeres Projektverzeichnis erstellt und CDs darin erstellt
  • Ich möchte weiterhin den workonBefehl virtualenvwrapper verwenden , um jedes Projekt unabhängig von der Python-Version zu aktivieren

Richtungen:

Angenommen, Ihr vorhandenes Projekt hat den Namen foound führt derzeit Python 2 ( mkproject -p python2 foo) aus. Die Befehle sind jedoch dieselben, unabhängig davon, ob Sie ein Upgrade von 2.x auf 3.x, 3.6.0 auf 3.6.1 usw. durchführen. Ich gehe auch davon aus, dass Sie Sie befinden sich derzeit in der aktivierten virtuellen Umgebung.

1. Deaktivieren und entfernen Sie die alte virtuelle Umgebung:

$ deactivate
$ rmvirtualenv foo

Beachten Sie, dass Sie, wenn Sie den Hooks benutzerdefinierte Befehle hinzugefügt haben (z. B. bin/postactivate), diese speichern müssen, bevor Sie die Umgebung entfernen.

2. Verstecken Sie das eigentliche Projekt in einem temporären Verzeichnis:

$ cd ..
$ mv foo foo-tmp

3. Erstellen Sie die neue virtuelle Umgebung (und das Projektverzeichnis) und aktivieren Sie:

$ mkproject -p python3 foo

4. Ersetzen Sie das leere generierte Projektverzeichnis durch ein reales Projekt und wechseln Sie zurück in das Projektverzeichnis:

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

5. Installieren Sie die Abhängigkeiten neu, bestätigen Sie die neue Python-Version usw.:

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

Wenn dies ein häufiger Anwendungsfall ist, werde ich in Betracht ziehen, eine PR zu öffnen, um so etwas wie $ upgradevirtualenv/ $ upgradeprojectzu virtualenvwrapper hinzuzufügen.

Taylor Edmiston
quelle
1
Ja bitte. Ich habe die Hälfte davon hinter mir und bekam große Probleme ... Eine Überprüfung wäre schön, da der erste Schritt nach dem Löschen (nach meinem derzeitigen Kenntnisstand) irreversibel ist
Chris Frisina
2

Dieser Ansatz funktioniert bei mir immer:

# 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

Genommen von:

Anton Danilchenko
quelle
1

Ich habe mein Home-Verzeichnis von einem Mac auf einen anderen verschoben (Mountain Lion zu Yosemite) und habe die kaputte virtuelle Umgebung erst bemerkt, als ich den alten Laptop verloren hatte. Ich hatte den virtualenv-Punkt auf Python 2.7 installiert brewund da Yosemite mit Python 2.7 geliefert wurde, wollte ich mein virtualenv auf das System-Python aktualisieren. Als ich virtualenvüber das vorhandene Verzeichnis lief, wurde eine OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'Fehlermeldung angezeigt. Durch Ausprobieren habe ich dieses Problem umgangen, indem ich einige Links entfernt und einige weitere manuell behoben habe. Dies ist, was ich schließlich getan habe (ähnlich wie @Rockalite, aber einfacher):

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

Danach konnte ich virtualenv einfach über dem vorhandenen Verzeichnis ausführen.

haridsv
quelle
1

Unter OS X oder MacOS mit Homebrew zum Installieren und Aktualisieren von Python3 musste ich symbolische Links löschen, bevor python -m venv --upgrade ENV_DIRdies funktionieren würde.

Ich habe Folgendes in upgrade_python3.sh gespeichert, damit ich mich daran erinnere, in welchen Monaten ich es erneut tun muss:

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

UPDATE: Während dies zunächst gut zu funktionieren schien, gab es beim Ausführen von py.test einen Fehler. Am Ende habe ich die Umgebung aus einer Anforderungsdatei neu erstellt.

Jeff C Johnson
quelle
py.testfunktioniert nicht, weil `~ / .virtualenvs / myenv / bin / python3.7 kein Symlink ist und daher nicht aktualisiert wird.
Ash Berlin-Taylor
Ah eigentlich ist das Problem, ~/.virtualenvs/myenv/.Pythondass es einen Symlink gibt.
Ash Berlin-Taylor
1

Wenn Sie verwenden pipenv, weiß ich nicht, ob es möglich ist, eine vorhandene Umgebung zu aktualisieren, aber zumindest für kleinere Versions-Upgrades scheint es klug genug zu sein, Pakete nicht neu zu erstellen, wenn eine neue Umgebung erstellt wird. ZB von 3.6.4 bis 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
>>>
David Moles
quelle
genial! Vielen Dank für dieses Juwel
Mayur Patil
1

Ich möchte nur klarstellen, weil sich einige der Antworten auf venvund andere beziehen virtualenv.

Die Verwendung des Flags -poder --pythonwird unterstützt virtualenv, jedoch nicht venv. Wenn Sie mehr als eine Python-Version haben und angeben möchten, mit welcher Version die erstellt venvwerden soll, führen Sie dies in der Befehlszeile folgendermaßen aus:

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

Sie können natürlich ein Upgrade mit durchführen, venvwie andere bereits betont haben. Dies setzt jedoch voraus, dass Sie bereits den Python aktualisiert haben, mit dem das ursprünglich erstellt wurde venv. Sie können nicht auf eine Python-Version aktualisieren, die Sie noch nicht irgendwo auf Ihrem System haben. Stellen Sie daher sicher, dass Sie zuerst die gewünschte Version und dann alle gewünschten Venvs daraus erstellen.

Malik A. Rumi
quelle
1

Schritt 1: Einfrieren der Anforderung und Sichern der vorhandenen Umgebung

pip freeze > requirements.txt
deactivate
mv env env_old

Schritt 2: Installieren Sie Python 3.7 und aktivieren Sie die virutale Umgebung

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

Schritt 3: Installieren Sie die Anforderungen

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

Für alle mit dem Problem

Fehler: Der Befehl '[' / Users / me / Sites / site / venv3 / bin / python3 ',' -Im ',' surepip ',' --upgrade ',' --default-pip ']' hat einen Wert ungleich Null zurückgegeben Exit-Status 1.

Sie müssen python3.6-venv installieren

 sudo apt-get install python3.6-venv
JanL
quelle