Ich habe einen Ordner erstellt und eine virtualenv-Instanz darin initialisiert.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Wenn ich starte (env)$ pip freeze
, werden die installierten Pakete so angezeigt, wie sie sollten.
Jetzt möchte ich umbenennen myproject/
in project/
.
$ mv myproject/ project/
Jetzt aber, wenn ich renne
$ . env/bin/activate
(env)$ pip freeze
es heißt, pip ist nicht installiert. Wie benenne ich den Projektordner um, ohne die Umgebung zu beschädigen?
python
ubuntu
virtualenv
pip
Riley Watkins
quelle
quelle
Antworten:
Sie müssen Ihre Installation anpassen, um relative Pfade zu verwenden.
virtualenv
sieht dies mit der--relocatable
Option vor. Aus den Dokumenten :quelle
grep -EIr '\Wold_venv_name\W' /path/to/new_venv
hilft bei der Suche nach Shabangs, die das alte Venv verwenden, ist jedoch keine vollständige Überprüfung des verlagerten Venv..project
Datei virtualenvwrapper bearbeiten , die den Pfad zum Quellcode enthält, der von virtualenv abhängt, vorausgesetzt, Sie verwenden virutalenvwrapper und haben das Projektverzeichnis entsprechend der neuen virtualenv umbenannt.Ich glaube, "zu wissen warum" ist wichtiger als "zu wissen wie" . Hier ist ein anderer Ansatz, um dies zu beheben.
Wenn Sie ausführen
. env/bin/activate
, werden tatsächlich die folgenden Befehle ausgeführt (/tmp
z. B.):Sie haben jedoch nur umbenannt
myproject
zuproject
, so dass der Befehl ausführen fehlgeschlagen. Aus diesem Grund heißt espip is not installed
, dass Sie nichtpip
in der globalen Systemumgebung installiert haben und Ihre virtuelle Umgebungpip
nicht korrekt bezogen ist.Wenn Sie dies manuell beheben möchten, gehen Sie wie folgt vor:
Ändern Sie mit Ihrem Lieblingseditor wie Vim
/tmp/project/env/bin/activate
normalerweise in Zeile 42:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
Ändern Sie
/tmp/project/env/bin/pip
in Zeile 1:#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
Aktivieren Sie danach Ihre virtuelle Umgebung
env
erneut und Sie werden sehen, dass Ihrepip
wieder zurückgekehrt ist.quelle
grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name
. Tatsächlich bemerkte ich, dass in einer meiner Django-Instanzen viele Pakete den "Pfad zu Python sh-bang" enthielten.virtualenv
. Vielleicht gibt es einen Anwendungsfall, den ich nicht verwende und daher nicht auf das Problem stoße.virtualenv
. Um es zu lösen, habe ich den Bash-Header (wie heißt er?) In deripython
Datei bearbeitet und dann hat es gut funktioniert.HINWEIS: Als @jb. weist darauf hin, dass diese Lösung nur für einfach (neu) erstellte
virtualenv
s gilt. Wenn die Installation einer Umgebung mehrere Stunden dauert, wird diese Lösung nicht empfohlenVirtualenvs sind großartig, weil sie einfach zu erstellen und umzuschalten sind. Sie verhindern, dass Sie an eine einzelne Konfiguration gebunden werden. Wenn Sie die Projektanforderungen kennen oder erhalten können, erstellen Sie eine neue
virtualenv
:Erstellen Sie eine
requirements.txt
Datei(env)$ pip freeze > requirements.txt
requirements.txt
Datei nicht erstellen können , überprüfen Sie dies,env/lib/pythonX.X/site-packages
bevor Sie das Original entfernenenv
.Löschen Sie die vorhandene
(env)
deactivate && rm -rf env
Erstellen Sie eine neue
virtualenv
, aktivieren Sie sie und installieren Sie die Anforderungenvirtualenv env && . env/bin/activate && pip install -r requirements.txt
Alternativ können Sie virtualenvwrapper verwenden, um die Arbeit etwas zu vereinfachen, da alle virtualenvs an einem zentralen Ort aufbewahrt werden
quelle
pip install -r requirements.txt
dauert es ein paar Stunden (Kompilieren von C-Erweiterungen von Drittanbietern auf Himbeer-Pi).virtualenv env && pip install -r requirements.txt
wird die Anforderungen NICHT in der neuen Umgebung installieren, weil Sie es nicht aktivierenvirtualenv-wrapper
Benutzer selbst zu sein (was bei der Erstellung automatisch aktiviert wird). Ich habe meine Antwort aktualisiert, um die Aktivierung zu aktivieren,virtualenv
um Verwirrung zu vermeiden.Ich installiere immer virtualenvwrapper, um zu helfen. Von der Shell-Eingabeaufforderung:
In den virtualenvwrapper-Dokumenten ist eine Möglichkeit dokumentiert: cpvirtualenv Dies ist, was Sie tun. Stellen Sie sicher, dass Sie sich nicht in Ihrer Umgebung befinden und zur Shell-Eingabeaufforderung zurückkehren. Geben Sie dies mit den erforderlichen Namen ein:
Und dann, wenn nötig:
So gehen Sie zu Ihrem neuen:
quelle
virtualenvwrapper
, nicht nurvirtualenv
. Diese Antwort von @ryankdwyer ist besser.Sie können Ihr Problem folgendermaßen beheben:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
um zu überprüfen, ob Ihre Pakete vorhanden sindquelle
--relocatable
, denke ich, dass diese Lösung besser ist als die akzeptierte Antwort. Bisher ist mir aufgefallen, dass sich viele.pyc
Dateien_new_name_/lib/python2.7
noch auf beziehen_old_name_
. Dies scheint jedoch keinen Einfluss auf die Funktionsweise meiner Umgebung zu haben. Vielleicht ist die einzig bessere Lösung die Verwendungvirtualenvwrapper
oder einiger der anderen Dienstprogramme, die in den Antworten hier erwähnt werden. Zumindest erfordert diese Lösung keine Installation zusätzlicher Programme.Ein weiterer Weg, der für mich viele Male ohne Probleme funktioniert hat, ist virtualenv-clone :
quelle
(im Projektordner)
Vergessen Sie nicht, zu deaktivieren und zu aktivieren
quelle
sed -i "s|$old_dir|$new_dir|g" bin/*
sed -i '.original' 's/old_dir_name/new_dir_name/g' *
für Macsvirtualenv --relocatable ENV
ist keine wünschenswerte Lösung. Ich gehe davon aus, dass die meisten Leute die Möglichkeit haben möchten, eine virtuelle Umgebung ohne langfristige Nebenwirkungen umzubenennen .Deshalb habe ich ein einfaches Tool erstellt, um genau das zu tun. Die Projektseite für virtualenv-mv beschreibt es etwas detaillierter, aber im Wesentlichen können
virtualenv-mv
Sie es genauso verwenden, wie Sie eine einfache Implementierung vonmv
(ohne Optionen) verwenden würden.Beispielsweise:
Bitte beachten Sie jedoch, dass ich dies gerade gehackt habe. Es kann unter ungewöhnlichen Umständen (z. B. mit verknüpften virtuellen Umgebungen) kaputt gehen. Seien Sie also vorsichtig (sichern Sie, was Sie sich nicht leisten können, zu verlieren) und lassen Sie mich wissen, wenn Sie auf Probleme stoßen.
quelle