2013-08-24 23 views
24

Obecnie rozwijam swój pierwszy prawdziwy projekt python-flask i mam zamiar skonfigurować serwer kompilacji, aby wdrożyć "najnowszą kompilację", która jest budowana przy każdym odprawie.Jak uruchomić uwsgi z virtualenv

Ustawiłem skrypt uruchamiania, w którym uruchamiam aplikację za pomocą uwsgi i ta część działa poprawnie. Niedawno zacząłem również używać virtualenv i w ten sposób zainstalowane pakiety są dodawane do mojego projektu pod projectname\flask\Lib\site-packages.

Używam nginx jako serwer WWW i config wygląda następująco:

location/{ try_files $uri @graderbuild; } 
location @graderbuild { 
    include uwsgi_params; 
    uwsgi_param UWSGI_CHDIR /usr/local/grader/build; 
    uwsgi_param UWSGI_PYHOME /usr/local/grader/build; 
    uwsgi_pass 127.0.0.1:3031; 
} 

Zaczynam uwsgi pomocą tego:

exec /usr/local/bin/uwsgi --master --socket 127.0.0.1:3031 
    --wsgi-file restserver.py --callable app --processes 4 --die-on-term 
    --threads 2 >> /var/log/grader-build.log 2>&1 

Teraz tam, gdzie wiem, czy ja” m robi to dobrze ... obecnie rozmieszczam cały folder na serwerze kompilacji. Nie chcę instalować globalnych modułów pythona tylko po to, aby moja kompilacja działała. Prawda czy fałsz?

Błąd pojawia aktualnie jest:

ImportError: No module named flask_wtf 

Jeśli mam rację, w jaki sposób skonfigurować ustawienia do korzystania z site-packages virtualenv? Moja preferowana lokalizacja byłaby w skrypcie startup, a nie w konfiguracji nginx.

Odpowiedz

31

Użyj -H, aby ustawić virtualenv na python path.

uwsgi -H /path/to/your/virtualenv 

http://uwsgi-docs.readthedocs.org/en/latest/Options.html#virtualenv

+2

to zmieniło, ale teraz mam: 'ImportError: No module o nazwie site'. Czy wiesz, co to może być? – Asken

+1

Próbowałem zaczynając od '--no-site' ale potem nie mogę zaimportować' os' modułu – Asken

+0

@Asken Spróbuj utworzyć virtualenv za pomocą '--system-site-packages'? – iMom0

10

Jak user995394 pointed na zewnątrz, nie ma sposobu, aby powiedzieć uWSGI wykorzystywać istniejące środowisko wirtualne. Jednakże, gdy przekazuję opcję uWSGI w postaci virtualenv = /full/path/to/my/virtualenv (jest to z konfiguracji INI), narzeka ona na ImportError: No module named site. Obejście, które znalazłem, polega na tym, że uruchamiasz uWSGI z folderu, w którym twój virtualenv jest i przekazuje tylko virtualenv = my_virtualenv_name (tzn. Ścieżka jest względna).

Używam uWSGI 2.0.

+0

Czy możesz podać konkretny przykład my_virtualenv-name? Używam virtualenvwrapper i próbowałem ścieżki ~/.virtualenvs/a-virtualenv-created-by-virtualenvwrapper/i nazwy a-virtualenv-created-by-virtualenvwrapper, to nie działa. – attolee

+0

@attolee, spróbuj ścieżki '~/.virtualenvs /' i opcji 'virtualenv = a-virtualenv-created-by-virtualenvwrapper' – Palasaty

+1

to nie działa. Mam dane wyjściowe, 'wersja Pythona: 2.7.6 (domyślnie, 22 czerwca 2015, 18:01:27) [GCC 4.8.2] Ustaw PythonHome na ~/.virtualenvs/ ImportError: Brak modułu o nazwie site', i 'Wersja Pythona: 2.7.6 (domyślnie, 22 czerwca 2015, 18:01:27) [GCC 4.8.2] Ustaw PythonHome na python3.4.3-uwsgi-django1.8-nginx ImportError: Brak modułu o nazwie site ' , przy okazji, używam również pyenv do zarządzania wersją Pythona. – attolee

9

Aby korzystać aktywowany virtualenv można użyć tego config fragment w swojej uwsgi.ini:

; If VIRTAL_ENV is set then use its value to specify the virtualenv directory 
if-env = VIRTUAL_ENV 
virtualenv = %(_) 
endif = 
+3

To najlepsze rozwiązanie, jeśli używasz virtualenv, ponieważ ma on także elastyczność pracy w różnych środowiskach (produkcja/tworzenie/rozwój) z różnymi nazwami venv! – Alain1405

+3

To powinna być zaakceptowana odpowiedź. Dzięki! – aldesabido

+0

'pipenv' tworzy dynamicznie nazywane virtualenvs, więc podejrzewam, że to podejście będzie coraz bardziej powszechne wraz z kontynuacją' pipenv'. – paperreduction

Powiązane problemy