Poprzedni wpis (Pewna reorganizacja) | Następny wpis (PyconPL 2009)

Wirtualne pythony na Megiteam.pl

Megiteam.pl w swoich dokumentach pomocy proponuje jeden sposób na oddzielenie swojego środowiska Pythona od systemowego, a także na ustalenie wersji Pythona, z jaką ma być uruchamiana aplikacja. Metodą prób i błędów doszedłem do innego, jak mi się wydaje także lepszego, sposobu na osiągnięcie tego celu.

Virtualenv na pomoc

Virtualenv to obecnie najpopularniejszy sposób na wirtualizację środowiska uruchomieniowego aplikacji. Mocno korciło mnie, by go wykorzystać do oddzielenia środowiska aplikacji od Pythona dostarczanego przez Megiteam.pl i w końcu się udało. Potrzebny będzie do tego plik virtualenv.py z dystrybucji źródłowej virtualenv. Kopiujemy go sobie w jakieś poręczne miejsce, np. do ~/.. Potem już idzie normalnie:

~$ mkdir v
~$ python2.5 virtualenv.py v/chrzczone
New python executable in v/chrzczone/bin/python2.5
Also creating executable in v/chrzczone/bin/python
Installing setuptools................done.
~$ cd v/chrzczone/
~/v/chrzczone$ bin/easy_install -U -Z psycopg2 \
    Django pytz Babel BabelDjango \
    django-registration django-tagging-ng \
    django-pagination

Po kilku minutach mamy już swoje środowisko w katalogu $HOME/v/chrzczone. Pozostaje tylko ustawić aplikację tak, żeby wiedziała kto tu rządzi. Do tego służy plik .environment w katalogu aplikacji. Oto jak on wygląda w mojej przykładowej aplikacji o nazwie "chrzczone":

PATH=$HOME/v/chrzczone/bin:/usr/local/python2.5/bin:$PATH
PYTHONPATH=$HOME/v/chrzczone/lib/python2.5/site-packages:/usr/local/python2.5/lib/python2.5/site-packages

Wszystko w tym momencie powinno działać, ponieważ pliki .environment są dołączane kaskadowo i zmienne zdefiniowane w nich nadpisują zdefiniowane wcześniej. Ale jest również lepsza (mniej podatna na błędy) metoda osiągnięcia tego samego — żeby wszystko zagrało wystarczy, że plik .environment będzie zawierał tylko jedną linijkę:

source $HOME/v/chrzczone/bin/activate

(dzięki, Eluś, masz u mnie piwo w Ustroniu).

Ale po co to wszystko?!

A choćby po to, żeby łatwiej można było tym zarządzać, np. przy robieniu deploymentu przy użyciu Pavera. Virtualenv obecnie staje się standardową metodą zapewniania rozdzielności środowisk uruchomieniowych Pythona, dającym tyle izolacji, ile się chce. Jest wygodne i bardzo upraszcza obsługę takiego zwirtualizowanego środowiska, zwalniając z konieczności ręcznego ustawiania zmiennych środowiskowych — wystarczy zaimportować w powłoce skrypt aktywujący środowisko i wszystko jest na swoim miejscu. A jeżeli używa się virtualenvwrapper to rzeczy proste stają się jeszcze prostsze (workon, mmm...).

Komentarze (7)

#1 lbadura skomentował(-a) 14 października 2009 o 12:13

Dzięki za wskazówki. Sam ostatnio zacząłem korzystać z virtualenv i powoli zacząłem się zastanawiać jak to wykorzystać na serwerach MegiTeamu.

#2 Eluś skomentował(-a) 14 października 2009 o 22:48

A nie wystarczy w pliku .environment wpisać `. v/chrzczone/bin/activate` i pozwolić mu przestawić zmienne systemowe? Czy pominąłem jakiś fakt?

#3 jarek skomentował(-a) 15 października 2009 o 08:39

@Eluś - może i wystarczy. W każdym razie warte spróbowania. :)

Sprawdzone, działa. Wpis zaktualizowany z Twoją sugestią.

#4 asd skomentował(-a) 22 października 2009 o 12:34

Niestety, --no-site-packages zdaje się nie działać - po zrobieniu source activate wciąż mogę importować dodatkowe pakiety zainstalowane w $HOME/.python/.../site-packages, choć nie mam ich w wirtualnej instancji.

#5 asd skomentował(-a) 22 października 2009 o 12:42

Sam sobie odpowiem. :) Skrypt activate nie czyści $PYTHONPATH (co swoją drogą jest dziwne...), więc trzeba zadbać o usunięcie z niej wskazań do innych katalogów z pakietami samodzielnie: http://tinyurl.com/yfdbcpb

#6 jarek skomentował(-a) 22 października 2009 o 13:33

Dlatego napisałem o "tylko jednej linijce w .environment". :)

#7 asd skomentował(-a) 22 października 2009 o 19:00

Zgoda, ale "tylko jedna linijka w .environment" aplikacji nie wyklucza podstępnego ustawienia PYTHONPATH w $HOME/.environment :). Wtedy proces aplikacji będzie miał wyizolowane środowisko, ale pod konsolą będzie już inaczej.

Skomentujesz?

* 


* 


* oznacza pole wymagane