Utworzyłem folder i zainicjowałem w nim instancję virtualenv.
$ mkdir myproject
$ cd myproject
$ virtualenv env
Kiedy uruchamiam (env)$ pip freeze
, pokazuje zainstalowane pakiety tak, jak powinno.
Teraz chcę zmienić nazwę myproject/
na project/
.
$ mv myproject/ project/
Jednak teraz, kiedy biegnę
$ . env/bin/activate
(env)$ pip freeze
mówi, że pip nie jest zainstalowany. Jak zmienić nazwę folderu projektu bez niszczenia środowiska?
python
ubuntu
virtualenv
pip
Riley Watkins
źródło
źródło
Odpowiedzi:
Musisz dostosować swoją instalację, aby używała ścieżek względnych.
virtualenv
przewiduje to za pomocą--relocatable
opcji. Z dokumentów :źródło
grep -EIr '\Wold_venv_name\W' /path/to/new_venv
pomoże znaleźć wszystkie shabangi, które używają starego venv, ale nie jest pełną weryfikacją przeniesionego venv..project
plik virtualenvwrapper , który zawiera ścieżkę do kodu źródłowego zależnego od virtualenv, zakładając, że używasz virutalenvwrapper, a także zmieniłeś nazwę katalogu projektu, aby pasował do nowego virtualenv.Uważam, że „wiedzieć dlaczego” jest ważniejsze niż „wiedzieć jak” . Oto inne podejście do rozwiązania tego problemu.
Po uruchomieniu
. env/bin/activate
faktycznie wykonuje następujące polecenia (/tmp
na przykład używając ):Jednak właśnie zmieniłeś nazwę
myproject
naproject
, więc to polecenie nie zostało wykonane. Dlatego mówipip is not installed
, ponieważ nie zainstalowałeśpip
w globalnym środowisku systemu, a twój virtualenvpip
nie jest prawidłowo pozyskiwany.Jeśli chcesz to naprawić ręcznie, oto sposób:
W swoim ulubionym edytorze, takim jak Vim, modyfikuj
/tmp/project/env/bin/activate
zwykle w linii 42:VIRTUAL_ENV='/tmp/myproject/env'
=>VIRTUAL_ENV='/tmp/project/env'
Zmień
/tmp/project/env/bin/pip
w linii 1:#!/tmp/myproject/env/bin/python
=>#!/tmp/project/env/bin/python
Następnie
env
ponownie aktywuj swoje wirtualne środowisko , a zobaczysz, żepip
wróciłeś.źródło
grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name
. W rzeczywistości zauważyłem, że w jednej z moich instancji Django wiele pakietów zawierało „ścieżkę do Pythona sh-bang”.virtualenv
. Być może jest jakiś przypadek użycia, którego nie używam, więc nie napotykam problemu.virtualenv
. Aby rozwiązać ten problem, wyedytowałem nagłówek bash (jak to się nazywa?) Wipython
pliku i wszystko działało dobrze.UWAGA: As @jb. zwraca uwagę, to rozwiązanie dotyczy tylko łatwych (ponownie) utworzonych
virtualenv
plików. Jeśli instalacja środowiska zajmuje kilka godzin, to rozwiązanie nie jest zalecaneWirtualne maszyny są świetne, ponieważ są łatwe do wykonania i przełączania; zapobiegają zamknięciu się w jednej konfiguracji. Jeśli znasz wymagania projektu lub możesz je zdobyć, utwórz nowy
virtualenv
:Utwórz
requirements.txt
plik(env)$ pip freeze > requirements.txt
requirements.txt
pliku, sprawdźenv/lib/pythonX.X/site-packages
przed usunięciem oryginałuenv
.Usuń istniejące
(env)
deactivate && rm -rf env
Utwórz nowy
virtualenv
, aktywuj go i zainstaluj wymaganiavirtualenv env && . env/bin/activate && pip install -r requirements.txt
Alternatywnie, użyj virtualenvwrapper, aby trochę ułatwić, ponieważ wszystkie virtualenv są przechowywane w scentralizowanej lokalizacji
źródło
pip install -r requirements.txt
zajmuje to kilka godzin (kompilacja rozszerzeń C innych firm na raspberry pi).virtualenv env && pip install -r requirements.txt
NIE zainstaluje wymagań w nowym środowisku, ponieważ go nie aktywujeszvirtualenv-wrapper
użytkownikiem (który automatycznie aktywuje się podczas tworzenia). Zaktualizowałem swoją odpowiedź, aby zawierała aktywacjęvirtualenv
w nadziei uniknięcia nieporozumień.Aby pomóc, zawsze instaluję virtualenvwrapper. Z wiersza polecenia powłoki:
Jest sposób udokumentowany w dokumentach virtualenvwrapper - cpvirtualenv To właśnie robisz. Upewnij się, że jesteś poza środowiskiem i wróć do znaku zachęty powłoki. Wpisz to z wymaganymi nazwami:
A następnie, jeśli to konieczne:
Aby przejść do swojego newenv:
źródło
virtualenvwrapper
, a nie tylkovirtualenv
. Ta odpowiedź od @ryankdwyer jest lepsza.Możesz rozwiązać problem, wykonując następujące czynności:
$ virtualenv ..\path\renamed_directory
$ scripts/activate
$ pip freeze
aby sprawdzić, czy paczki są na miejscuźródło
--relocatable
, myślę, że to rozwiązanie jest lepsze niż zaakceptowana odpowiedź. Do tej pory zauważyłem, że wiele.pyc
plików_new_name_/lib/python2.7
nadal odwołuje się do_old_name_
. Jednak wydaje się, że nie ma to wpływu na działanie mojego środowiska. Być może jedynym lepszym rozwiązaniem jest użycievirtualenvwrapper
lub niektórych innych narzędzi wymienionych w odpowiedziach tutaj. Przynajmniej to rozwiązanie nie wymaga instalowania dodatkowych programów.Innym sposobem na zrobienie tego, który działał u mnie wiele razy bez problemów, jest virtualenv-clone :
źródło
(wewnątrz folderu projektu)
Nie zapomnij dezaktywować i aktywować
źródło
sed -i "s|$old_dir|$new_dir|g" bin/*
sed -i '.original' 's/old_dir_name/new_dir_name/g' *
dla komputerów Macvirtualenv --relocatable ENV
nie jest pożądanym rozwiązaniem. Zakładam, że większość ludzi chce mieć możliwość zmiany nazwy virtualenv bez żadnych długoterminowych skutków ubocznych.Stworzyłem więc proste narzędzie, które to robi. Strona projektu dla virtualenv-mv przedstawia go nieco bardziej szczegółowo, ale zasadniczo możesz używać
virtualenv-mv
tak, jakbyś używał prostej implementacjimv
(bez żadnych opcji).Na przykład:
Pamiętaj jednak, że właśnie to zhakowałem. Może się zepsuć w nietypowych okolicznościach (np. Wirtualneenvs z dowiązaniem symbolicznym), więc bądź ostrożny (wykonaj kopię zapasową tego, czego nie możesz stracić) i daj mi znać, jeśli napotkasz jakiekolwiek problemy.
źródło