2013-08-24 11 views
24

Attualmente sto sviluppando il mio primo progetto di vero python e sto per configurare il server di build per distribuire la "Ultima build" che è costruita su ogni check-in.Come eseguo uwsgi con virtualenv

Ho impostato uno script di avvio in cui avvio l'applicazione utilizzando uwsgi e questa parte funziona correttamente. Recentemente ho anche iniziato a utilizzare virtualenv e così facendo i pacchetti installati vengono aggiunti al mio progetto sotto projectname\flask\Lib\site-packages.

sto usando nginx come server web e la configurazione si presenta così:

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; 
} 

sto iniziando uwsgi utilizza questo:

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 

Ora per dove so se ho' sto facendo bene ... attualmente sto distribuendo l'intera cartella sul server di build. Non voglio installare i moduli Python globali solo per far funzionare la mia build. Giusto o sbagliato?

L'errore che ottengo è attualmente:

ImportError: No module named flask_wtf 

Se ho ragione, come faccio a configurare il setup per utilizzare le virtualenv site-packages? La mia posizione preferita sarebbe nello script startup e non nella configurazione nginx.

risposta

31

Utilizzare -H per impostare virtualenv sul percorso python.

uwsgi -H /path/to/your/virtualenv 

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

+2

è cambiato, ma ora ho: 'ImportError: Nessun modulo denominato site'. Sai cosa potrebbe essere? – Asken

+1

Provato a partire da '--no-site' ma non posso importare il modulo' os' – Asken

+0

@Asken Prova a creare il tuo virtualenv con '--system-site-packages'? – iMom0

10

Come user995394 pointed fuori, c'è un modo per dire uWSGI usare ambiente virtuale esistente. Tuttavia, quando si passa l'opzione uWSGI nel modulo virtualenv = /full/path/to/my/virtualenv (proviene da INI config) si lamenta di ImportError: No module named site. La soluzione che ho trovato è che si avvia uWSGI dalla cartella in cui si trova la virtualenv e si passa appena virtualenv = my_virtualenv_name (ovvero il percorso è relativo).

Io uso uWSGI 2.0.

+0

Puoi dare un esempio specifico di my_virtualenv-name? Io uso virtualenvwrapper e ho provato il percorso ~/.virtualenvs/a-virtualenv-created-by-virtualenvwrapper/e il nome a-virtualenv-created-by-virtualenvwrapper, non funziona. – attolee

+0

@attolee, prova il percorso '~/.virtualenvs /' e l'opzione 'virtualenv = a-virtualenv-created-by-virtualenvwrapper' – Palasaty

+1

non funziona. Ho ottenuto l'output, 'Versione Python: 2.7.6 (impostazione predefinita, 22 giugno 2015, 18:01:27) [GCC 4.8.2] Imposta PythonHome in ~/.virtualenvs/ ImportError: nessun modulo denominato site', e 'Versione Python: 2.7.6 (impostazione predefinita, 22 giugno 2015, 18:01:27) [GCC 4.8.2] Imposta PythonHome su python3.4.3-uwsgi-django1.8-nginx ImportErrore: Nessun modulo denominato sito ' , a proposito, uso anche pyenv per gestire la versione di Python. – attolee

9

Per utilizzare il attivato virtualenv è possibile utilizzare questo config frammento nel vostro uwsgi.ini:

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

Questa è la soluzione migliore se si utilizza virtualenv in quanto ha anche la flessibilità di lavorare in ambienti diversi (produzione/messa in scena/sviluppo) con diversi nomi venv! – Alain1405

+3

Questa dovrebbe essere la risposta accettata. Grazie uomo! – aldesabido

+0

'pipenv' crea virtualenvs denominati dinamicamente, quindi sospetto che questo approccio sarà sempre più comune mentre continua l'adozione di' pipenv'. – paperreduction