Jakiej struktury katalogów należy przestrzegać podczas używania virtualenv
? Na przykład, gdybym budował aplikację WSGI i tworzył virtualenv o nazwie foobar
, zacząłbym od struktury katalogów takiej jak:
/foobar
/bin
{activate, activate.py, easy_install, python}
/include
{python2.6/...}
/lib
{python2.6/...}
Po utworzeniu tego środowiska, gdzie można umieścić własne:
- pliki python?
- pliki statyczne (obrazy / itp.)?
- Opakowania „niestandardowe”, takie jak te dostępne online, których nie można znaleźć w sklepie z serami?
w stosunku do virtualenv
katalogów?
(Załóżmy, że już wiem, gdzie powinny znajdować się same katalogi virtualenv ).
python
project
virtualenv
Phillip B Oldham
źródło
źródło
Odpowiedzi:
virtualenv
udostępnia instancję interpretera języka Python, a nie instancję aplikacji. Zwykle nie tworzyłbyś plików aplikacji w katalogach zawierających domyślny systemowy Python, podobnie nie ma wymagania, aby lokalizować aplikację w katalogu virtualenv.Na przykład możesz mieć projekt, w którym masz wiele aplikacji korzystających z tego samego virtualenv. Lub możesz testować aplikację za pomocą virtualenv, który zostanie później wdrożony w systemowym Pythonie. Lub możesz pakować samodzielną aplikację, w której sensowne może być umieszczenie katalogu virtualenv gdzieś w samym katalogu aplikacji.
Tak więc, ogólnie rzecz biorąc, nie sądzę, aby istniała jedna prawidłowa odpowiedź na to pytanie. I dobrą rzeczą
virtualenv
jest to, że obsługuje wiele różnych przypadków użycia: nie musi być jeden właściwy sposób.źródło
virtualenvwrapper
), jest wtedy, gdy chcę edytować podpięciapostactivate
ipostdeactivate
.virtualenv
katalogu jest czystsze , ale porównanievirtualenv
do systemu python jest niepomocne, ponieważ celemvirtualenv
jest naprawianie zepsutych zależności i izolowanie projektów, aby mogły używać różnych wersji pakietów, a nawet wersji Pythona (zdaję sobie sprawę, że zostało to napisane wcześniej -python3). Zezwalanie aplikacjom na współużytkowanie plikuvirtualenv
używavirtualenv
tak, jakby to był systemowy Python, pozostawiając aplikacje podatne na te same problemy, które ma rozwiązać virtualenv.There should be one obvious way to do it
; logicznie powinno to być 1: 1Jeśli masz tylko kilka projektów co jakiś czas, nic nie stoi na przeszkodzie, aby utworzyć nowy virtualenv dla każdego z nich i umieścić swoje pakiety bezpośrednio w środku:
Zaletą tego podejścia jest to, że zawsze możesz być pewien, że w środku znajdziesz skrypt aktywacyjny należący do projektu.
Jeśli zdecydujesz się na nieco bardziej zorganizowaną organizację, powinieneś pomyśleć o umieszczeniu wszystkich swoich virtualenvów w jednym folderze i nazwać każdy z nich po projekcie, nad którym pracujesz.
W ten sposób zawsze możesz zacząć od nowa z nowym virtualenvem, gdy coś pójdzie nie tak, a pliki projektu pozostaną bezpieczne.
Kolejną zaletą jest to, że kilka projektów może korzystać z tego samego virtualenv, więc nie musisz powtarzać tej samej instalacji, jeśli masz wiele zależności.
W przypadku użytkowników, którzy regularnie muszą konfigurować i niszczyć virtualenv, warto przyjrzeć się virtualenvwrapper.
Z virtualenvwrapper możesz
Nie musisz już martwić się o to, gdzie są twoje virtualenvy podczas pracy nad projektami „foo” i „bar”:
Oto jak zaczynasz pracę nad projektem „foo”:
W takim przypadku przejście na „pasek” projektu jest tak proste:
Całkiem fajnie, prawda?
źródło
virtualenvwrapper
. Starannie oddziela virtualenv, a jednocześnie zapewnia wszystkie korzyści.venv/
katalog na tym samym poziomie co projektBASE_DIR
.Ponieważ virtualenv nie można przenosić, moim zdaniem umieszczanie plików projektu w katalogu virtualenv jest złą praktyką. Sam virtualenv jest wygenerowanym artefaktem programowania / wdrażania (coś w rodzaju pliku .pyc), a nie częścią projektu; powinno być łatwe do zdmuchnięcia i odtworzenia w dowolnym momencie lub utworzenie nowego na nowym hoście wdrażania itp.
W rzeczywistości wiele osób korzysta z virtualenvwrapper , który prawie całkowicie usuwa rzeczywiste virtualenv z twojej świadomości, domyślnie umieszczając je wszystkie obok siebie w $ HOME / .virtualenvs.
źródło
virtualenv --relocatable myvenv
Strony stackoverflow.com/a/6628642/1335793 tylko dlatego, że możesz, nie znaczy, że powinieneś.Jeśli nadasz projektowi a
setup.py
, pip może zaimportować go bezpośrednio z kontroli wersji.Zrób coś takiego:
Projekt
-e
umieści projektmyproject/src
, ale połączy go z nimmyproject/lib/pythonX.X/site-packages/
, więc wszelkie wprowadzone zmiany zostaną natychmiast odebrane w modułach, które importują go z lokalnegosite-packages
. Ten#egg
bit mówi pipowi, jaką nazwę chcesz nadać paczce jajek, którą dla ciebie utworzy.Jeśli nie używasz
--no-site-packages
, uważaj, aby określić, że chcesz zainstalować pip w virtualenv za pomocą-E
opcjiźródło