Kann ich eine virtuelle Umgebung verschieben?

89

Diese Frage ist kein Duplikat.

Es bezieht sich nicht nur auf das Umbenennen einer virtuellen Umgebung, sondern tatsächlich bewegt es in ein anderes Verzeichnis, darunter möglicherweise auch eines anderen Benutzers zu Verzeichnis.

Dies ist nicht dasselbe wie das bloße Umbenennen einer virtuellen Umgebung, insbesondere für Personen, die mit virtuellen Umgebungen nicht vertraut sind.

Wenn ich eine virtuelle Umgebung erstelle und sie in einen anderen Ordner verschiebe, funktioniert sie dann noch?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $ 

... später an diesem Tag bewegte sich die virtuelle Umgebung ...

(my-python-venv) $ deactivate
$ mkdir -p /home/me/PeskyPartyPEnvs
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/

Frage:

Ob das funktioniert?

$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas

Ich meine dies weniger als eine Frage der Weisheit, dies zu versuchen (es sei denn, diese Weisheit ist natürlich humorvoll), als vielmehr, ob es möglich ist. Ich möchte wirklich wissen, ob dies in Python 3 möglich ist oder ob ich es nur aufsaugen und klonen muss.

Kann ich nur mveine virtualenvohne Traurigkeit , dass wie? Ich möchte Traurigkeit vermeiden.

Nathan Basanese
quelle

Antworten:

69

Ja. Es ist möglich, es auf derselben Plattform zu verschieben. Sie können --relocatablein einer vorhandenen Umgebung verwenden.

Von --help:

--relocatable - Machen Sie eine vorhandene virtuelle Umgebung umsetzbar. Dies korrigiert Skripte und macht alle .pth-Dateien relativ.

Dies scheint jedoch das activateSkript NICHT zu ändern , sondern nur die Skripte pip*und easy_install*. Im activateSkript ist die $VIRTUAL_ENVUmgebungsvariable als Original fest codiert /path/to/original/venv. Die $VIRTUAL_ENVVariable wird benutzt , die festlegen PATHzu Ihrer aktiven Umgebung, so dass es auf der Grundlage der neuen Position , um zu nennen geändert werden muss pythonund pipusw. ohne absoluten Pfad.

Um dieses Problem zu beheben, können Sie die $VIRTUAL_ENVUmgebungsvariable im activateSkript ändern (z. B. mit sed), und alles sollte in Ordnung sein.

Ein Anwendungsbeispiel:

$ cd ~/first
$ virtualenv my-venv
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV="/home/username/first/my-venv"
$ virtualenv --relocatable my-venv
Making script my-venv/bin/easy_install relative
Making script my-venv/bin/easy_install-2.7 relative
Making script my-venv/bin/pip relative
Making script my-venv/bin/pip2 relative
Making script my-venv/bin/pip2.7 relative
### Note that `activate` has not been touched
$ mkdir ~/second
$ mv my-venv ~/second
$ cd ~/second
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV=/home/username/first/my-venv
### (This variable hasn't been changed, it still refers to the old, now non-existent directory!)
$ sed -i -e 's|username/first|username/second|' my-venv/bin/activate
## sed can be used to change the path.
## Note that the `-i` (in place) flag won't work on all machines. 
$ source my-venv/bin/activate 
(my-venv) $ pip install foass
...
(my-venv) $ python 
[...]
> import foass

Hurra, jetzt können Sie Dinge installieren und in Ihre neu lokalisierte virtuelle Umgebung laden.

Hilcharge
quelle
//, Hm. Dies scheint nicht dazu zu führen, dass diese verlagerbar sind. Ich bekomme immer wieder Fehler, dass sie keine "normalen" Skriptdateien sind.
Nathan Basanese
7
"Die Option --relocatable weist derzeit eine Reihe von Problemen auf und funktioniert nicht unter allen Umständen. Es ist möglich, dass die Option in einer zukünftigen Version von virtualenv nicht mehr unterstützt wird. " (Hervorhebung von mir) siehe Benutzerhandbuch
BobTuckerman
1
Ich habe dies unter Windows versucht und der Fehler listet alle Skripte (* .py, * .bat, * .ps1) im Verzeichnis auf Scripts(entspricht binon * nix) und sagt so etwas wie im activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.Grunde, dass es sich über den Hash-Bang in der Datei beschwert Der Header ist nicht die python.exe der aktuellen virtualenv, sondern die, aus der ich ihn von -easy fixed verschoben habe. Ich habe in diesem noblen Drehbuch nachgesehen und es entdeckt sowieso schon seinen eigenen Weg - schön. Einige der anderen Skripte basieren auch nicht auf Pfaden (z. B. disable.bat). Kurz gesagt, dies funktioniert.
Davos
2
@NathanBasanese Die Nachricht activate.ps1 cannot be made relativekann ignoriert werden, da dieses Skript bereits relativ ist. Die Nachricht ist unter Windows nicht hilfreich, da Skripte keine #!Anweisungen wie unter Linux verwenden, um der Shell mitzuteilen, welche Anwendung sie ausführen soll. Das activate.batwird nicht geändert, aber es wird nicht verwendet (zumindest unter Windows 10 activatestartet der Aufruf das PoSH-Skript), also nein, ich musste keine Skripte bearbeiten. Das Problem ist pip.exe, dass der Pfad zu Python fest codiert ist und mit einem Hex-Editor oder nur einer Neuinstallation bearbeitet werden muss.
Davos
3
@Sgedda Im Nachhinein würde ich sagen, mach das nicht. Ihre Python-Umgebungen sollten mit mindestens pip freezeeiner Anforderungsdatei problemlos neu erstellt werden können, damit Sie alle Ihre Pakete, Docker (funktioniert gut mit darauf installierten virtualenv), conda, pyenv oder anderen Tools problemlos neu installieren können. Sie sollten in der Lage sein, Umgebungen als unveränderliche Infrastruktur zu erstellen und zu zerstören. Sie sollten nicht wertvoll sein.
Davos
15

Für Python 3.3+ (mit neuem venvintegrierten Modul)

Kurze Antwort (unabhängig von der Version):

  • Es gibt keine saubere und direkte Möglichkeit, eine virtuelle Umgebung zu verschieben
  • Einfach neu erstellen, es ist einfach !!


Lange Antwort:

Ab Python v3.3 wurde virtualenvein integriertes Modul mit dem Namen venv.

Die --relocatablein anderen Antworten erwähnte Option wurde nicht berücksichtigt venv, und derzeit gibt es keine gute und sichere Möglichkeit, eine virtuelle Python-Umgebung umzubenennen oder zu verschieben.

Es gibt jedoch eine ziemlich einfache Möglichkeit, eine virtuelle Umgebung mit all ihren aktuell installierten Paketen einfach neu zu erstellen. Informationen zum Wiederherstellen einer virtuellen Umgebung finden Sie in dieser Antwort oder im folgenden Abschnitt. Während des Vorgangs können Sie die neue Umgebung an einem beliebigen Ort und mit einem beliebigen Namen neu erstellen. Oder lesen Sie den folgenden Abschnitt für den Vorgang.

In dieser Antwort erwähnt er einige andere Pakete von Drittanbietern, die direkte Umbenennungen oder Verschiebungen unterstützen können. Wenn Sie sich dazu entschließen, eine virtuelle Umgebung intakt zu halten, können Sie prüfen, ob diese auch funktionieren venv.

Hinweis: In dieser Antwort wird virtualenveher auf als auf konzentriert venv. Weiter unten erfahren Sie, wie Sie übersetzen.



venvältere virtualenvBefehlssyntax

Der zu verwendende Befehl venvlautet:

python -m venv

anstatt nur virtualenv, was als Befehl im Originalpaket installiert wird. Wobei sich "Python" darauf bezieht, wie auch immer Sie Ihre ausführbare Python-Datei ausführen. Dies kann eine Vielzahl von Dingen sein, wie zum Beispiel:

  1. python
  2. pyoder py -3.7ähnlich (der Python Launcher für Windows für Python 3.3+ und Windows derzeit nur)
  3. python3 (Konvention für Linux-Umgebungen, in denen Python 2 und 3 doppelt installiert werden)
  4. Wenn Sie Probleme haben, verwenden Sie den absoluten Pfad zu der ausführbaren Python-Datei, die Sie ausführen möchten: z c:\program files\python37\python.exe

Wenn Sie sich nicht sicher sind, welche Version ausgeführt wird, können Sie dies jederzeit python --versionherausfinden.



So erstellen Sie eine virtuelle Umgebung neu

Das Erstellen / Neuerstellen einer virtuellen Umgebung ist einfach und sollte zur zweiten Natur werden, nachdem Sie ein wenig mit ihnen gearbeitet haben. Dieser Prozess spiegelt wider, was Sie tun würden, um Ihr Skript als Paket (mit seinen Abhängigkeiten) in der ersten Hälfte zu verteilen, und was dann jemand tun würde, um Ihr Skript / Paket für die weitere Entwicklung zu installieren.

Holen Sie sich zunächst eine aktualisierte Liste der Inhalte in der virtuellen Umgebung. Wenn es aktiv ist, rufen Sie die verwendete Python-Version ab und speichern Sie die Liste der Abhängigkeiten in einer Datei.

  1. Verwenden Sie diese Option python --versionbei aktivierter virtueller Umgebung, um zu sehen, welche Python-Version verwendet wird.

    • Dies dient der Übersichtlichkeit. Möglicherweise möchten Sie die Python-Version aus verschiedenen Gründen aktualisieren - zumindest auf die neueste Patch-Version
    • Wenn das vorhandene venv beispielsweise Python v3.7.4 verwendet, jetzt aber v3.7.6 nicht mehr verfügbar ist, verwenden Sie stattdessen v3.7.6, das nur fehlerfreie Sicherheits- und Fehlerkorrekturen enthalten sollte.
  2. Verwenden Sie python -m pip freeze > requirements.txtdiese Option , um die Liste der aktuellen Paketabhängigkeiten zu erstellen und in die requirements.txtDatei einzufügen. Dieser Befehl funktioniert sicher unter Linux oder Git Bash - nicht 100% sicher über Powershell oder Command Line unter Windows.

Erstellen Sie nun eine neue virtuelle Umgebung und fügen Sie die Abhängigkeiten von der alten hinzu.

  1. Mach dein neues Venv.

    • Stellen Sie sicher, dass Sie die richtige Version von Python verwenden, die Sie auf dem venv installieren möchten.
    • Wenn Sie möchten, dass es genau dieselbe Python-Version ist:
      • Führen Sie Python direkt aus der aktuellen virtuellen Umgebung aus (bei aktivierter Umgebung) und verwenden Sie es einfach pythonals Befehl
      • Oder verwenden Sie einen absoluten Pfad mit python.exeim Ordner für die virtuelle Umgebung
    • Für den neuen venv-Ordnereintrag im Befehl:
      • Fügen Sie dem gewünschten endgültigen Ordner einen absoluten oder relativen Pfad hinzu.
      • Verwenden Sie python -m venv my_new_venvdiese Option , um eine neue virtuelle Umgebung im aktuellen Arbeitsverzeichnis in einem neuen my_new_venvOrdner zu erstellen .
      • Der Name des venv-Ordners ist der Name des venv (was in der Eingabeaufforderung angezeigt wird, wenn es aktiviert ist).
  2. Installieren Sie Ihre Abhängigkeiten aus der requirements.txtDatei.

    • python -m pip install -r requirements.txt

Möglicherweise müssen Sie lokale Pakete neu installieren, die sich im Entwicklungsmodus befinden.

Hinweis: Wenn Sie jemals den Speicherort anzeigen müssen, an dem ein Paket installiert ist, verwenden Sie:

  • python -m pip list -v
  • Mit der -vOption oder "ausführlich" werden einige zusätzliche Informationen zu jedem installierten Paket hinzugefügt, einschließlich des Pfads, in dem es installiert ist. Dies ist nützlich, um sicherzustellen, dass virtuelle, Benutzer- und Systeminstallationspakete gerade bleiben.

An dieser Stelle können Sie einfach den alten venv-Ordner und alle Inhalte löschen. Ich empfehle, dafür eine grafische Benutzeroberfläche zu verwenden. Das Löschen von Dateien über die Linux-Befehlszeile ist häufig dauerhaft, und ein kleiner Tippfehler kann eine schlechte Nachricht sein.

LightCC
quelle
Gibt es keine Möglichkeit , den venv pip-Status zu kopieren , dh ohne alle Bibliotheken mit pip erneut herunterladen zu müssen?
Aydo
Ich bin mir nicht sicher, warum Sie das möchten - liegt es an einer Situation mit extrem geringer Bandbreite im Internet oder an der massiven Notwendigkeit, viel zu duplizieren? Ich glaube, Sie könnten alle Reißverschlüsse von pypi erhalten und dann lokal installieren, aber ich bin nicht auf dem neuesten Stand. Ich weiß, dass Sie einen lokalen Pip-Server einrichten können, um Pakete zu hosten.
LightCC
Das Problem (das ich zu lösen versuche) ist, dass ich ein Python-Skript auf einem Computer ausführen möchte, der keinen Netzwerkverkehr zulässt (oder fast überall). Ich kann Dateien darauf ablegen, aber es kann nicht mit pip sprechen. Ein Nischenfall sicher, aber genau, warum ich diese Dinge bewegen muss.
Richard Rast
@RichardRast Das ist ein anderes Problem, ich beantworte nur die ursprüngliche Frage. Hinweis: Es gibt Lösungen für Ihr Problem (Pakete als Zips herunterladen und lokal installieren, einen PyPi-Spiegelserver hinter Ihrer Firewall ausführen usw.), aber dies ist nicht das Richtige: Fragen und
Antworten dazu
2
Sie können Räder aus all Ihren Paketen mit erstellen pip wheel . -w wheelsund dann die Pakete in der neuen virtuellen Umgebung mitpip install --no-index --find-links /path/to/wheels/ -r requirements.txt
np8
7

Das --relocatableArgument to virtualenvscheint dies zu ermöglichen.

Ruth Franklin
quelle
//, Verlässt sich das nur auf relative Pfade oder läuft es irgendwie anders herum?
Nathan Basanese
1
--relocatable funktioniert nur in vorhandenen virtuellen Umgebungen. Führen Sie virtualenv --relocatable my-python-venvNACH der bereits vorhandenen Umgebung aus.
Hilcharge
1
Von --help: This fixes up scripts and makes all .pth files relative. Nein, es werden keine plattformunabhängigen Bibliotheken erstellt. Wenn Sie es auf eine andere Plattform verschieben möchten, müssen Sie es basierend auf der lokalen Python neu installieren.
Hilcharge
5
Das Python3 Venv-Modul unterstützt dieses Flag nicht
Nelson
7

ABER ALAS:

Nein, das kannst du nicht einfach mv. Es gibt Problemumgehungen, die Neuinstallation ist jedoch möglicherweise einfacher.

(my-python-venv)$ /home/me/PeskyPartyPEnvs/pip3 install foaas
zsh: /home/me/PeskyPartyPEnvs/pip3: bad interpreter: /home/me/Env/my-python-venv/bin/python3: no such file or directory
(my-python-venv)$ deactivate
$ 

... drückt enterviel frustriert und das Folgende funktioniert

$
$
$ pip3 search foaas

Außer es ist nicht von my-python-venv, ergo Traurigkeit.

Willst mvdu dein virtualenvund benutzt es, sonst unverändert?

Kurze Antwort:

Ich werde Boromir es sagen lassen, damit er es klarstellen kann:

Nun, du kannst nicht .

Nathan Basanese
quelle
2
es sei denn, Sie möchten blutig werden und es entsprechend ändern: Es sind die Links in den Binärdateien in der Bin, die das Bewegungsproblem verursachen. Wenn Sie wissen, woher Sie kommen, können Sie beispielsweise find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;annehmen, dass sich Ihr bin und lib in Ihrem aktuellen venv-Ordner befinden. Ich benutze dies als eine schnelle und schmutzige Methode, um virtuelle Python3-Envs mit vielen installierten Pip-Paketen zu kopieren und zu verschieben.
Paul Whipp
1
@PaulWhipp Gibt es einen Vorteil bei der Verwendung dieses Befehls gegenüber der bloßen Verwendung --relocatable? Auch Nathan, tolle Frage, aber das ist eine schreckliche Antwort. Das Akzeptieren Ihrer eigenen Antwort ist immer ein wenig voreingenommen, es sei denn, es ist gut geschrieben und listet die Optionen klar auf, aber zu bestimmen, dass Sie trotzdem subjektiv wären.
Davos
1
@Davos --relocatable hat bei mir nicht funktioniert, aber ich verschiebe python3 venvs routinemäßig durch Hacken der Binärdateien und hatte bisher keine Probleme.
Paul Whipp
1
Ich habe angedeutet, dass Sie eine andere (dh nicht Ihre) Antwort akzeptieren sollten. Vielleicht die vom Volk gewählte: D
Davos
3
Die Frage lautete "Kann ich einfach mvein Venv?" Und die Antwort lautet "Nein, Sie können nicht einfach mv, es gibt Problemumgehungen, aber die Neuinstallation ist möglicherweise einfacher". Wenn dies die beste Antwort wäre, würde es mir und anderen Zeit sparen.
Nickolay
5

Ja, dies sollte möglich sein, wenn Sie nichts getan haben, was vom aktuellen Verzeichnis der virtuellen Umgebung abhängt.

Wenn Sie jedoch die Wahl haben, ist es am besten, eine neue virtuelle Umgebung zu erstellen und stattdessen die neue virtuelle Umgebung zu verwenden. Dies ist die sicherste Wahl und führt am wenigsten später zu Problemen.

In der Dokumentation wird Folgendes erwähnt :

In jede virtuelle Umgebung sind Pfadinformationen fest codiert.

Wenn Sie beispielsweise ausgeführt haben, kann es nach der Ausführung setvirtualenvprojectnicht in das richtige Verzeichnis wechseln. workon ...In diesem Fall müssen Sie dies manuell beheben.

Im Allgemeinen ist eine virtuelle Umgebung kaum mehr als ein Verzeichnis mit den erforderlichen Python-Interpreterdateien und den benötigten Paketen.

Simeon Visser
quelle
2

Unter Verwendung der Antworten dieses und anderer Threads zu ähnlichen Themen habe ich ein Bash-Skript erstellt, das sich im Verzeichnis virtualenv befindet und ausgeführt wird und bei Ihren Bewegungen von virtualenv hilft.

Danach müssen virtualenv --relocatable yourenvSie Ihre VIRTUAL_ENVVariable jedes Mal ändern , wenn Sie das Verzeichnis verschieben. Wenn Sie sie also nicht manuell ändern möchten, verwenden Sie diese Option.

#!/bin/bash \n 
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
EXISTING=$(grep 'VIRTUAL_ENV=' bin/activate)  
NEWDIR=VIRTUAL_ENV=\"$DIR\"
sed -i -e "s|$EXISTING|$NEWDIR|" bin/activate
source bin/activate

Ich hoffe, es hilft.

Gerbs
quelle
0

JA, DU KANNST! (In windows)

Die Abhilfe ist einfach, nur Ihre virtuelle Umgebung bewegt überall dann bearbeiten activate.batinnen scripts\:

  1. Wechseln Sie in die virtuelle Umgebung in das gewünschte Verzeichnis

  2. Klicken Sie mit der rechten Maustaste und bearbeiten Sie activate.batunter venv_folder\scripts.

  3. VIRTUAL_ENVVariable ändern von:

     set VIRTUAL_ENV=C:\old_directory\venv_name
    

    in

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
  4. Speichern Sie die bearbeitete Batch-Datei und fertig!

HINWEIS: Meine Lösung sollte funktionieren und das windows usersEinrichten neuer virtueller Umgebungen speichern. Ich bezweifle, dass dies unter anderen Betriebssystemen funktioniert, da .bates von stammtMS-DOS

Kyle Olodin
quelle
Wechseln old_directoryzu old_directory- ist das ein Tippfehler?
Bestätigen Sie den
Verdammt, ja, es ist danke
Kyle Olodin