So duplizieren Sie virtualenv

129

Ich habe eine vorhandene virtuelle Umgebung mit vielen Paketen, aber einer alten Version von Django.

Ich möchte diese Umgebung duplizieren, damit ich eine andere Umgebung mit genau denselben Paketen, aber einer neueren Version von Django habe. Wie kann ich das machen?

dolma33
quelle
3
Ich würde alle Ihre Anforderungen in eine 'require.txt'-Datei einfrieren und eine weitere virtuelle Umgebung erstellen und pip installquirements.txt ausführen
Calvin Cheng
Wenn sich die Python-Version der virtuellen Umgebung, die Sie kopieren möchten, von Ihrer Standard-Python-Umgebung unterscheidet, können Sie die neue Umgebung als virtualenv -p /path/to/older/venv/bin/python new_venvrequirements.txtpip freeze
einrichten

Antworten:

182

Am einfachsten ist es, mit pip eine Anforderungsdatei zu generieren. Eine Anforderungsdatei ist im Grunde eine Datei, die eine Liste aller Python-Pakete enthält, die Sie installieren möchten (oder bei einer von pip generierten Datei bereits installiert haben), und welche Versionen sie haben.

Um eine Anforderungsdatei zu generieren, rufen Sie Ihre ursprüngliche virtuelle Umgebung auf und führen Sie Folgendes aus:

pip freeze > requirements.txt

Dadurch wird die Erzeugung requirements.txt Datei für Sie. Wenn Sie diese Datei in Ihrem bevorzugten Texteditor öffnen, sehen Sie Folgendes:

Django==1.3
Fabric==1.0.1
etc...

Nun bearbeiten die Zeile , die sagt Django==x.xzu sagen Django==1.3(oder was auch immer Version möchten Sie in Ihrem neuen virtualenv installieren).

Zuletzt aktivieren Sie Ihre neue virtuelle Umgebung und führen Sie Folgendes aus:

pip install -r requirements.txt

Und pip wird automatisch heruntergeladen und alle das Python - Module in Ihrer aufgelistet installiert requirements.txt Datei, egal auf welchen Versionen von Ihnen angegebenen!

rdegges
quelle
3
Danke dir! Während ich googelte, fand ich so viele verrauschte, unordentliche und verwirrende Seiten ... Ihre Lösung ist so sauber und einfach ... es machte meinen Tag;)
dolma33
Was ist, wenn ich den Ordner kopiere und dann auf einem anderen Computer einfüge? Es würde funktionieren? Vorausgesetzt natürlich, die Apt-Get-Abhängigkeiten wurden gelöst
Tales Pádua
In der Tat nicht, wie ich gerade herausfinde.
horcle_buzz
Ich sehe viele Nachrichten Could not find a version that satisfies the requirement a_package=#.#.#Kann ich es leicht lösen? Ich habe eine Zeile entfernt oder die Gleichheit in die Ungleichung geändert.
Change-the-World
Funktioniert auch für pyenv. Tolle Antwort.
Leonard
29

Eine andere Option ist die Verwendung von virtualenv-clonepackage:

Ein Skript zum Klonen einer nicht verschiebbaren virtuellen Umgebung.

Alecxe
quelle
Hallo, kann ich zu Recht davon ausgehen, dass ich damit eine GANZE Python-Umgebung in eine Datei kopieren kann? Dann müsste ich nur diese Datei in einen neuen Computer / Betriebssystem laden und ich würde alle meine Site-Pakete zurück installieren
aceminer
2
"virtualenv-clone source / target /" hat wie ein Zauber funktioniert, danke!
Ajankuv
virtualenv-cloneStellen
Sie
15

virtualenvwrapperbietet einen Befehl zum Duplizieren von virtualenv

cpvirtualenv ENVNAME [TARGETENVNAME]
Raymond
quelle
7
Keine wirklich gute Idee. "Das Kopieren virtueller Umgebungen wird nicht gut unterstützt. In jede virtuelle Umgebung sind Pfadinformationen fest codiert, und es kann Fälle geben, in denen der Kopiercode nicht weiß, dass eine bestimmte Datei aktualisiert werden muss. Mit Vorsicht verwenden."
Temak
5

Wenn Sie Anaconda verwenden , können Sie einfach Folgendes ausführen:

conda create --name myclone --clone myenv

Dies wird myenvin die neu erstellte Umgebung namens kopiert myclone.

Jordanien
quelle
4

Die einfachste Option ist die Verwendung eines virtualenv-clonePakets.

Gehen Sie folgendermaßen venv1vor venv2, um zu duplizieren :

  1. Installieren Sie virtualenv-clonein einer venv1oder einer virtuellen Dummy-Umgebung venv_dummy. So erstellen Sie venv_dummy:

    python -m virtualenv venv_dummy
    source venv_dummy/bin/activate
  2. So installieren Sie virtualenv-clone:

    (venv_dummy): pip install virtualenv-clone
  3. Duplizieren venv1zu venv2:

    (venv_dummy): virtualenv-clone venv1/ venv2/
Safwan
quelle
Die Eingabeaufforderung in Bash ist nicht geändert, muss bin / aktivieren bearbeiten und nicht 100% klar wie
MrR
@ MrR .. Sie müssen nicht bearbeiten, bin/activatewenn Sie dieser Antwort folgen. Warum musst du bearbeiten bin/activate?
Safwan
Nachdem ich geklont habe, hatte meine Eingabeaufforderung in bash aufgrund des PS1-Abschnitts inbin/activate
MrR
1

Kannst du nicht einfach:

  • Kopieren Sie das vorhandene virtuelle env-Verzeichnis in ein neues
  • Update auf den neuen Django?
Spacedman
quelle
7
Manchmal verwende ich diesen Ansatz, habe aber die Unannehmlichkeit, einige Pfade innerhalb des bin / enable-Skripts aktualisieren zu müssen.
Armando Pérez Marqués
3
Ist die Änderung ein einfaches Suchen und Ersetzen von Verweisen auf den env-Namen oder ist sie komplizierter?
Greg
1
In meinem Fall hat das einfache Aktualisieren des Pfads in der Konstante VIRTUAL_ENV in bin /
activ
1
Auf der anderen Seite ist das Ändern von bin / enable ein ziemlicher Hack, und man muss sich fragen, ob dies irgendwann etwas kaputt machen kann. Insbesondere, wenn virtuelle Umgebungen in Produktionseinstellungen verwendet werden.
Herbert
2
Es bricht viele Dinge. Es ist einfacher, die virtuelle Umgebung einfach neu zu erstellen oder zu klonen. Ich habe versucht, genau dies zu tun (während ich darauf wartete, dass ein Proxyserver geöffnet wird, damit ich alle erforderlichen Pakete neu installieren und einfach von vorne anfangen kann), und es funktioniert nicht! Ich dachte, ich wäre schlau, aber leider wird es eine Menge Hacking erfordern, um dies zum Laufen zu bringen, und ehrlich gesagt gibt es viel bessere Dinge zu tun.
horcle_buzz