it-swarm.com.de

Aktualisieren Sie Python in einer virtuellen Umgebung

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

Ich könnte pip freeze --local > requirements.txt und dann das Verzeichnis und pip install -r requirements.txt entfernen, dies erfordert jedoch eine große Neuinstallation großer Bibliotheken, beispielsweise numpy, die ich häufig verwende. 

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

147
Simon Walker

Hast du this gesehen? Wenn ich diese Antwort nicht missverstanden habe, versuchen Sie möglicherweise, eine neue Virtualenv über der alten zu erstellen. Sie müssen nur wissen, welcher Python Ihre virtualenv verwenden wird (Sie müssen Ihre virtualenv-Version sehen). 

Wenn Ihre virtualenv mit der gleichen Python-Version der alten installiert ist und das Upgrade des virtualenv-Pakets nicht möglich ist, können Sie this lesen, um eine virtualenv mit der gewünschten Python-Version zu installieren.

EDIT

Ich habe diese Herangehensweise getestet (die Methode, mit der eine neue Virtualenv über der alten erstellt wird), und es hat gut funktioniert. Ich denke, dass Sie möglicherweise Probleme haben, wenn Sie von Python 2.6 zu 2.7 oder 2.7 zu 3.x wechseln. Wenn Sie jedoch nur die gleiche Version aktualisieren (bleiben Sie bei 2.7 wie gewünscht), sollten Sie keine Probleme haben, da alle Pakete vorhanden sind werden für beide Python-Versionen in denselben Ordnern abgelegt (die Pakete 2.7.x und 2.7.y befinden sich in your_env/lib/python2.7 /).

Wenn Sie Ihre Python-Version von Virtualenv ändern, müssen Sie alle Pakete für diese Version erneut installieren (oder die benötigten Pakete einfach in den neuen Versionspaketordner verlinken, d. H. Ihre_env/lib/python_newversion/site-packages).

60
marianobianchi

Wenn Sie das mit Python 3.3+ gelieferte venv-Modul verwenden, wird die Option --upgrade unterstützt. Per docs :

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

python3 -m venv --upgrade ENV_DIR
44
CoupleWavyLines

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

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

Nebeneffekt:behebt auch die Symbol not found: _SSLv2_method-Ausnahme, wenn Sie import ssl in einer virtuellen Umgebung nach dem Upgrade von Python auf v2.7.8 durchführen.

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


Wenn Sie Homebrew Python unter OS X verwenden, deactivate all virtualenv zuerst, dann aktualisieren Sie Python:

brew update && brew upgrade python

Führen Sie die folgenden Befehle aus (<EXISTING_ENV_PATH> ist 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 schließlich Ihre virtuelle Umgebung neu:

virtualenv <EXISTING_ENV_PATH>

Auf diese Weise werden alte Python-Kerndateien und Standardbibliotheken (plus setuptools und pip) entfernt, während die in site-packages installierten benutzerdefinierten Bibliotheken erhalten bleiben und funktionieren, sobald sie sich in Python befinden. 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 compilemessages danach nicht funktioniert, versuchen Sie Folgendes:

brew install gettext && brew link gettext --force
22
Rockallite

Ich konnte keine neue Virtualenv über die alte erstellen. Es gibt jedoch Tools in Pip, die das erneute Installieren von Anforderungen in einem brandneuen Server wesentlich schneller machen. Pip kann jedes Element in der Datei Requirements.txt in ein Radpaket umwandeln und in einem lokalen Cache speichern. Wenn Sie ein neues VenV erstellen und die Pip-Installation ausführen, verwendet Pip automatisch die vormontierten Räder, wenn sie gefunden werden. Räder werden viel schneller installiert, als dass für jedes Modul setup.py ausgeführt wird.

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 das Rad (pip install wheel) und starte dann pip wheel -r requirements.txt. Dadurch werden die verbauten Räder im Radverzeichnis in meiner pip.conf gespeichert.

Von da an, wenn ich eine dieser Anforderungen installiere, werden sie von den Rädern installiert, was ziemlich schnell geht. 

5
Russ Egan

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

Ich füge eine Antwort für alle hinzu, die Doug Hellmanns hervorragenden virtualenvwrapper verwenden, insbesondere da die vorhandenen Antworten dies für mich nicht getan haben.

Einige Zusammenhänge:

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

Richtungen:

Angenommen, Ihr vorhandenes Projekt hat den Namen foo und führt derzeit Python 2 (mkproject -p python2 foo) aus, obwohl die Befehle gleich sind, unabhängig davon, ob ein Upgrade von 2.x auf 3.x, 3.6.0 auf 3.6.1 usw. durchgeführt wird. Ich gehe ebenfalls davon aus Sie befinden sich derzeit in der aktivierten virtuellen Umgebung.

1. Deaktivieren und entfernen Sie die alte virtuelle Umgebung:

$ deactivate
$ rmvirtualenv foo

Wenn Sie den Hooks benutzerdefinierte Befehle hinzugefügt haben (z. B. bin/postactivate), müssen Sie diese vor dem Entfernen der Umgebung speichern.

2. Das reale Projekt in einem temporären Verzeichnis ablegen:

$ 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. Wechseln Sie wieder in das Projektverzeichnis:

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

5. Installieren Sie die Abhängigkeiten erneut, 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 $ upgradevirtualenv/$ upgradeproject zu virtualenvwrapper hinzuzufügen.

3
Taylor Edmiston

Unter OS X oder macOS mit Homebrew zur Installation und Aktualisierung von Python3 musste ich symbolische Links löschen, bevor python -m venv --upgrade ENV_DIR funktionieren würde.

Ich habe Folgendes in upgrade_python3.sh gespeichert, damit ich mich daran erinnern kann, wie viele Monate ich jetzt noch einmal machen muss:

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

UPDATE: Obwohl dies anfangs gut zu funktionieren schien, gab ich beim Ausführen von py.test einen Fehler. Am Ende habe ich einfach die Umgebung aus einer Anforderungsdatei neu erstellt.

1
Jeff C Johnson

Ich möchte nur klarstellen, da sich einige Antworten auf venv und andere auf virtualenv beziehen.

Die Verwendung des Flags -p oder --python wird für virtualenv unterstützt, nicht jedoch für venv. Wenn Sie mehr als eine Python-Version haben und angeben möchten, mit welcher Version die venv erstellt werden soll, führen Sie sie in der Befehlszeile folgendermaßen aus:

[email protected]:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

Sie können natürlich ein Upgrade mit venv durchführen, wie andere bereits erwähnt haben. Dies setzt jedoch voraus, dass Sie bereits den Python aktualisiert haben, mit dem diese venv erstellt wurde. Sie können nicht auf eine Python-Version upgraden, die Sie nicht bereits auf Ihrem System installiert haben. Stellen Sie also sicher, dass Sie die gewünschte Version herunterladen, bevor Sie alle gewünschten Versionen erstellen.

1
Malik A. Rumi

Wenn Sie pipenv verwenden, weiß ich nicht, ob es möglich ist, eine Umgebung zu aktualisieren, aber zumindest bei kleineren Versionsaktualisierungen scheint es klug genug zu sein, Pakete nicht neu zu erstellen, wenn eine neue Umgebung erstellt wird. Zum Beispiel 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
>>>
1
David Moles

Ich habe mein Heimatverzeichnis von einem Mac auf einen anderen verschoben (Mountain Lion to Yosemite) und wusste nichts von dem kaputten Virtualenv, bis ich den alten Laptop verloren hatte. Ich hatte den Virtualenv-Punkt auf Python 2.7 von brew installiert, und da Yosemite mit Python 2.7 kam, wollte ich meine Virtualenv auf das Systempython aktualisieren. Als ich virtualenv über das vorhandene Verzeichnis lief, erhielt ich OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'-Fehler. Durch Ausprobieren konnte ich dieses Problem umgehen, indem ich ein paar Links entfernte und ein paar manuell korrigierte. Das habe ich schließlich getan (ähnlich wie bei @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 das vorhandene Verzeichnis ausführen.

1
haridsv

Für alle mit dem Problem

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

Sie müssen python3.6-venv installieren

 Sudo apt-get install python3.6-venv
0
JanL