¿Cómo ejecuto uwsgi con virtualenv

Actualmente estoy desarrollando mi primer proyecto en un verdadero flask de python y estoy a punto de configurar el servidor de comstackción para implementar la “última comstackción” que se construye en cada registro.

He configurado un script de inicio donde inicio la aplicación usando uwsgi y esta parte funciona bien. Recientemente también comencé a usar virtualenv y, al hacerlo, los paquetes instalados se agregan a mi proyecto en projectname\flask\Lib\site-packages .

Estoy usando nginx como el servidor web y la configuración se ve así:

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

Estoy empezando a usar uwsgi esto:

 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 

Ahora, donde sé si lo estoy haciendo bien … actualmente estoy implementando la carpeta completa en el servidor de comstackción. No quiero instalar módulos globales de Python solo para que mi comstackción funcione. ¿Bien o mal?

El error que recibo actualmente es:

 ImportError: No module named flask_wtf 

Si tengo razón, ¿cómo configuro la configuración para usar los paquetes de sitio virtualenv ? Mi ubicación preferida estaría en el script de startup y no en la configuración de nginx .

Use -H para configurar virtualenv a la ruta de python.

 uwsgi -H /path/to/your/virtualenv 

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

Para usar el virtualenv activado, puede usar este fragmento de configuración en su uwsgi.ini :

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

Como señaló el usuario995394, hay una manera de indicar a uWSGI que use el entorno virtual existente. Sin embargo, cuando paso la opción uWSGI en forma virtualenv = /full/path/to/my/virtualenv (es de INI config) se queja de ImportError: No module named site . La solución que encontré es que inicias uWSGI desde la carpeta donde se encuentra tu virtualenv y solo pasas virtualenv = my_virtualenv_name (es decir, la ruta es relativa).

Yo uso uWSGI 2.0.

Tuve este problema hace unos meses y tengo un ejemplo completo de configuraciones de demostración aquí, incluyendo nginx, uwsgi que se inicia automáticamente con upstart en linux.

https://stackoverflow.com/a/27221427/567606

Las respuestas de otros no ayudaron, y agregué la ruta a virtualenv al archivo de configuración uwsgi.ini. El error desapareció.

 pythonpath = /path-to-virtualenv/project/lib/python2.7/site-packages 

La respuesta de Beau resolvió este problema para mí.

Nunca encontré una buena explicación para las directivas de archivos ini de uwsgi.

Hasta la respuesta de Beau, nunca vi una respuesta a lo que explicitly debería establecerse el valor de virtualenv: la raíz del árbol de python en el venv, la carpeta de la aplicación en los paquetes de sitios o la raíz del VENV TREE. ¿Qué sucede si no está utilizando un sistema de contenido virtual, a qué se configura el inicio, el árbol de aplicaciones, la parte superior de la carpeta bin de python, la carpeta lib de python o los paquetes dist?

Tengo esta aplicación trabajando en otro sistema, por lo que realmente no debería haber sido tan difícil ejecutarla bajo un contenedor docker. Ahora que lo tengo funcionando, revisé la instalación en funcionamiento y ahora veo que apunta a la parte superior del árbol de venv. Estaba usando virtualenvwrapper allí, así que es una ruta diferente a la que usaba solo virtualenv.

Me pregunto si es posible ejecutar esta aplicación sin el venv. Dado que esto se ejecutará en un contenedor acoplable, realmente no hay una buena razón para usar venvs, pero al observar las diferencias en la estructura de carpetas de python, son bastante diferentes entre python de sistema y python de venv.

El sistema python3 se divide en carpetas separadas y los archivos no están todos en una sola jerarquía, ya que están bajo un sistema de dominios. Si instala sus paquetes con pip, terminarán en / usr / local / lib / python3 / dist-packages, y esa ubicación NO tiene site.py o carpetas de codificaciones, por lo que muchos tienen errores de importación.

Después de solo unas pocas pruebas, descubrí que para ejecutar mi aplicación sin un sistema operativo, el uwsgi ini NO debería definir la configuración de inicio O virtualenv. Si la ruta de su sistema incluye tanto / usr / bin Y / usr / local / bin, debería funcionar y encontrar todo, incluso los paquetes instalados de pip van a otra parte con una jerarquía de carpetas diferente.