Anteriormente expliqué detalladamente cómo montar un servidor Web Nginx con soporte para Python a través de uWSGI, con el objetivo de servir una aplicación desarrollada utilizando el microframework Flask. En esta oportunidad demostraré los pasos necesarios para crear un entorno virtual de Python para uWSGI que permita aislar la aplicación Flask y al mismo tiempo hacer uso de Python 3.
Para comenzar, verificar las versiones de Python 2 y Python 3 disponibles:
root@debian9:~# python --version Python 2.7.13 root@debian9:~# python3 --version Python 3.5.3
El siguiente paso consiste en instalar virtualenv
si aún no se encuentra instalado. Además es necesario instalar las cabeceras de Python para poder compilar paquetes Python utilizando pip
:
root@debian9:~# apt-get install python3-virtualenv virtualenv python3-dev
virtualenv
es una herramienta que permite crear entornos virtuales de Python. Esto intenta resolver el problema de dependencias y versiones, e indirectamente permisos. Cada entorno virtual tiene su propio subdirectorio de instalación que no comparte con ningún otro entorno virtual. De esta forma se evita compartir librerías entre diferentes aplicaciones, las cuales pudieran necesitar diferentes versiones de las mismas para su funcionamiento.
El siguiente paso, entonces, consiste en cambiar al directorio de la aplicación y crear un entorno virtual:
root@debian9:~# cd /usr/local/flask/ root@debian9:/usr/local/flask# virtualenv -p python3 .env --no-site-packages Already using interpreter /usr/bin/python3 Using base prefix '/usr' New python executable in /usr/local/flask/.env/bin/python3 Also creating executable in /usr/local/flask/.env/bin/python Installing setuptools, pkg_resources, pip, wheel...done.
En este ejemplo se indica explícitamente a virtualenv
que se necesita utilizar Python 3. El contenido del nuevo entorno virtual es el siguiente:
root@debian9:/usr/local/flask# ll .env/ total 20 drwxr-xr-x 5 root root 4096 mar 20 08:32 . drwxr-xr-x 5 flask www-data 4096 mar 20 08:32 .. drwxr-xr-x 2 root root 4096 mar 20 08:33 bin drwxr-xr-x 3 root root 4096 mar 20 08:32 lib drwxr-xr-x 3 root root 4096 mar 20 08:32 share
A continuación es necesario instalar dentro del entorno virtual todos los paquetes de Python necesarios para el funcionamiento de la aplicación. En este caso sólo se debe instalar Flask y uWSGI. Activar el entorno e instalar los susodichos paquetes:
root@debian9:/usr/local/flask# source .env/bin/activate (.env) root@debian9:/usr/local/flask# pip install flask (.env) root@debian9:/usr/local/flask# pip install uwsgi
Al finalizar la instalación, desactivar el entorno virtual:
(.env) root@debian9:/usr/local/flask# deactivate root@debian9:/usr/local/flask#
Luego cambiar el ownership de todo el entorno virtual según corresponda:
root@debian9:/usr/local/flask# chown -R flask:www-data .env/
A fin de verificar el uso del entorno con la nueva versión de Python agrego una modificación en el código fuente de la aplicación Python:
root@debian9:/usr/local/flask# nano app.py
Importar la librería sys
:
import sys
Luego cambiar:
return "<h1>Working like a motherfuckin' charm!</h1>%s" % slipsum_code
Por:
working = "<h1>Working like a motherfuckin' charm!</h1>%s" % slipsum_code return "%s<p>Python version: %s.%s.%s</p>" % (working,sys.version_info.major,sys.version_info.minor,sys.version_info.micro)
Esto muestra la versión de Python en uso. Recargar uWSGI:
root@debian9:/usr/local/flask# service uwsgi reload [ ok ] Reloading uWSGI server: uwsgi.
Verificar el cambio en el código desde un navegador Web:

Ahora resta cambiar la configuración para hacer uso de la versión de uWSGI instalada dentro del entorno virtual, en lugar de la instalada a nivel sistema. Primero editar el archivo de inicialización de uWSGI:
root@debian9:/usr/local/flask# nano wsgi.ini
Agregar las siguientes variables:
virtualenv = /usr/local/flask/.env pythonpath = /usr/local/flask/.env
Luego editar el script de inicio del servicio:
root@debian9:/usr/local/flask# nano /etc/init.d/uwsgi
En el mismo, agregar la siguiente variable de configuración (luego de la variable PATH
):
VENV=/usr/local/flask/.env
Luego, debajo de la siguiente línea:
. /lib/lsb/init-functions
Agregar la configuración necesaria para activar el entorno virtual:
# Activar el entorno virtual de Python . ${VENV}/bin/activate
Además, cambiar la ruta al binario de uWSGI por el instalado en el entorno virtual. Cambiar:
DAEMON="/usr/local/bin/uwsgi"
Por:
DAEMON="${VENV}/bin/uwsgi"
Finalmente, reiniciar uWSGI:
root@debian9:/usr/local/flask# service uwsgi restart [ ok ] Restarting uWSGI server: uwsgi.
Verificar el funcionamiento:

En caso de problemas, acudir al log de uWSGI, ubicado en la ruta /var/log/uwsgi/uwsgi.log
.
Referencias
Tal vez pueda interesarte