#CómoSeHace – Crear entornos virtuales para Python

Hola a toda la gente cool y talentosa de la comunidad humanOS. Si eres desarrollador y estás cansado de programar con tantas líneas de código ambiguo que nadie entiende y además, deseas ser una persona realmente productiva y eficiente, tu misión es conocer Python. Un lenguaje genial que viene de la mano de Guido van Rossum para alegrarnos el resto de nuestros días ya que que permite ser utilizado en casi cualquier proyecto que deseemos desarrollar.

world-of-python

En muchas ocasiones tenemos ciertas librerías para este lenguaje que utilizamos en nuestros proyectos y no podemos instalarlas directamente en el sistema, ya sea para no entrar en conflicto con otros paquetes ó porque deseamos tener diferentes versiones instaladas al mismo tiempo y simplemente no podemos. Pues en python tenemos la solución para esto, los entornos virtuales.

Los entornos virtuales como bien explicaba permiten crear entornos de desarrollo con los cuales podemos probar diferentes versiones de nuestros sistemas que requieran utilizar diferentes librerías o paquetes. Una vez dada esta introducción, sugiero pasar a la acción.

1. Instalar virtualenvwrapper

Virtualenvwrapper es una herramienta que viene con todo lo necesario para crear nuestros entornos virtuales de forma muy sencilla. Para instalar virtualenvwrapper lo hacemos a través del comando:

sudo apt-get install virtualenvwrapper

Otra alternativa es utilizar tu instalador de paquetes favorito, ejemplo: Synaptic.

2. Configurar virtualenvwrapper

Una vez instalado procedemos a configurarlo. Para esto debemos agregar al final del archivo .bashrc que se encuentra oculto en la carpeta personal, la siguiente línea, que es la dirección donde se encuentra el acceso al archivo ejecutable de virtualenvwrapper:

source /etc/bash_completion.d/virtualenvwrapper

3. Utilizar los comandos

Luego de haber hecho esto ya podemos utilizar los comandos que provee virtualenvwrapper para gestionar nuestros entornos virtuales, veamos:

mkvirtualenv proyecto_virtualenv: crea el entorno proyecto_virtualenv

rmvirtualenv proyecto_virtualenv: elimina el entorno proyecto_virtualenv

workon proyecto_virtualenv: activa el entorno virtual proyecto_virtualenv

deactivate: desactiva el entorno virtual.

Por defecto los entornos virtuales se encontrarán en la carpeta titulada .virtualenvs que se creará en nuestro directorio personal cuando hagamos nuestro primer entorno virtual. En caso de que queramos cambiar esta dirección abrimos el fichero .bashrc antes mencionado y agregamos al final del mismo lo siguiente:

export WORKON_HOME=/home/usuario/.entornos_virtuales

y así se crearán los entornos virtuales a partir de ahora en la carpeta .entornos_virtuales ¿Sencillo verdad?.

 

Y esto es todo por ahora, en una próxima entrada estaremos viendo como instalar los paquetes de python dentro de estos entornos virtuales. Por último decir que es altamente recomendado usar entornos virtuales tanto en desarrollo, como en producción. No olvides dejar tus comentarios u observaciones sobre el tema, saludos.

16 comentarios » Puedes dejar tu comentario también

  1. 00

    henryraul

    dijo:

    Firefox 41.0 Ubuntu

    Excelente artículo, solo me queda una duda. En ubuntu muchas veces conviven varias versiones de python. ¿Como se le puede indicar con que versión de python queremos trabajar?

  2. 00

    leiserfg

    dijo:

    Google Chrome 45.0.2454.101 GNU/Linux x64

    virtualenv -p /dirección/del/python

  3. 00

    Sandor

    dijo:

    Firefox 39.0 Windows 10 x64 Edition

    Por fin la comunidad de python en que estado está, cuando es el próximo encuentro ?

  4. 00

    ALB3rt

    dijo:

    Firefox 41.0 Ubuntu

    Chama, tremenda propaganda a Python “deseas ser una persona realmente productiva y eficiente, tu misión es conocer Python” jajaj. te quedó buena
    Muy buen post, FELICIDADES!!.

  5. 00

    Ocl@y

    (autor) dijo:

    Firefox 40.0 Ubuntu

    @ALB3rt
    Gracias, se hace lo que se puede.Seguro que ahorita sacas un artículo de java diciendo algo parecido,jajaja. Saludos

  6. 00

    Heimdall

    dijo:

    Firefox 41.0 Ubuntu x64

    @Ocl@y
    Jeje, solo le agregaria al articulo la instalacion de los paquetes que deseemos en el entorno via pip.

  7. 00

    Heimdall

    dijo:

    Firefox 41.0 Ubuntu x64

    @Ocl@y
    Por cierto felicidades por el buen post.

  8. 00

    Henryk

    dijo:

    Firefox 41.0 Ubuntu

    Los entornos virtuales son mas o menos como “condones” para la ejecucion de las app en python. Yo creo que seria mejor que las dependencias se agregaran a nivel de proyecto (como los .jar en java), lo de los entornos virtuales esos es un parche a una mala arquitectura inicial. En mi opinion no son nada de lo que estar orgullosos.

  9. 00

    Ocl@y

    (autor) dijo:

    Google Chrome 40.0.2214.95 GNU/Linux

    @Henryk
    Pues yo, la verdad no tengo ningún problema con los entornos virtuales, una vez listos para despliegues, los copio y me los llevo juntos con mi app sin problemas y los pongo en otra PC. Solamente debes tener en cuenta las dependencias propias en el sistema operativo, por lo demás , hasta ahora sin ningún lío. No obstante se agradece tu comentario y preocupación. Saludos.

  10. 00

    whippiii

    dijo:

    Google Chrome 45.0.2454.101 GNU/Linux x64

    @Henryk
    No tengo idea de cómo es el funcionamiento de los JAR en Java.

    En Python, las bibliotecas de terceros se suelen guardar en carpetas específicas para que sean vistas por el intérprete desde cualquier lugar que se ejecute. En ocasiones, es necesario tener varias aplicaciones cuyas dependencias difieren en la versión. Esto se pudiera arreglar como dices, empaquetando todas las dependencias en una misma aplicación, lo que -por ejemplo- te haría responsable de actualizar toda tu aplicación por cada actualización que tengan las dependencias y tomando en cuenta que las correcciones de bugs son frecuentes, se tornaría bastante tedioso. Veo que usas Ubuntu: ¿te imaginas si todo el mundo aplicara el mismo modelo?¿para qué un repositorio que maneje dependencias si se puede encapsular todo en una misma aplicación?

    Bien, en Python la gestión de dependencias es manejada por una serie de herramientas que tienen su repositorio central en https://pypi.python.org/. Tomando el caso que expuse arriba, para aislar las dependencias de cada una de esas aplicaciones, sin que incluso una actualización del sistema las rompa, es necesario aislar estas aplicaciones en entornos virtuales. Es posible que haya aplicaciones que requieran las mismas dependencias y puedan ser ejecutadas bajo el mismo entorno. Esta facilidad ha tenido tanta aceptación en la comunidad de desarrollo de Python que fue integrada a la biblioteca estándar en la versión 3.3 del lenguaje si mal no recuerdo.

    Desconozco el modelo de desarrollo que se utilice en Java, pero tal cual te lo describo es en Python que es el lenguaje en el que programo actualmente. Si vas a abrir un debate sobre el tema, decir que es un parche sin fundamentos, es pecar de superficial y no aporta contenido adicional útil a este artículo.

    Te invito a que leas sobre los entornos virtuales en Python y de por qué son necesarios, además de recomendarte usarlos 😉

  11. 00

    Yunior

    dijo:

    Firefox 41.0 Windows 8.1 x64 Edition

    que le pasa a HumanOS que trato de publicar una pregunta y no se me publica?

  12. 00

    Obi-Wan Kenobi

    dijo:

    Firefox 40.0 Windows 7

    @Henryk
    Source?

  13. 00

    leiserfg

    dijo:

    Google Chrome 45.0.2454.101 GNU/Linux x64

    Si alguien usa fish lo quiere, tengo virtualenv parar fish ya que virtualenvwrapper es para bash. Tiene cosas como completamiento de virualenvironments.

  14. 00

    Heimdall

    dijo:

    Android Webkit 4.2 Android 4.2.2

    @leiserfg
    Me interesa obtenerlo

  15. 00

    Henryk

    dijo:

    Firefox 41.0 Ubuntu

    @whippiii
    Los .jar (incluyen pero no se limitan) son proyectos que exportas en un lugar y los agregas como dependencias de otro proyecto para utilizar lo que programaste antes.

    Actualizar la aplicación por cada actualización de las dependencias debe ser responsabilidad del desarrollador cuando verifique que la dependencia no cambió la implementación de lo que resuelve su problema. Si se hace automatico de alguna manera (o sin estudiar los cambios) y la dependencia cambia o elimina una funcionalidad que necesita tu aplicación, tendras un problema.

    Las herramientas para gestionar dependencias que mencionas bien podrian hacer su gestión dentro de la carpeta de código de tu proyecto y no en carpetas visibles para todo el mundo (lo que debe ser util y visible para todos ya esta incluido en la biblioteca estandar como bien dices).
    Siempre que leo sobre entornos virtuales veo que se justifican sus bondades y no se ve la raiz del problema que consiste en resolver la coexistencia de multiples versiones de una misma libreria. Este es un problema que existe a todos los niveles, entre proyectos en python (que es lo que resuelven los entornos virtuales) y dentro de la misma aplicación para python, java, C# (en java se llama “jar Hell” y existe un “DLL Hell” que supongo sea para C++ y los que corren en Windows). Por cierto investigare como resuelven este problema de multiples versiones de una dependencia dentro del mismo proyecto en python. Supongo que con classloaders y osgi. Lo que me lleva a lo siguiente.

    Imagina una app basada en plugins en python. En principio tienes que manosear al entorno virtual siempre que adiciones un plugin porque sus dependencias no se manejan dentro del proyecto, tienen que ser instaladas porque no vienen dentro de la aplicacion.

    En lugar de entornos virtuales les recomiendo compilar la solución con cx_Freeze u otra herramienta parecida y tendran un portable que solo depende de “libc”, que resuelve las dependencias localmente y de cierta manera hace la app mas segura porque trabaja con los .pyc en lugar de los .py y te quita el riesgo de que te cambien el codigo una vez que esta en producción.

    Todo lo que escribi ahora y en el comentario anterior esta basado en mi experiencia personal y en los problemas que me he encontrado trabajando tanto en java como python y las analogias que inevitablemente tengo que hacer.

    Por eso no puedo darte una fuente de nada @Obi-Wan Kenobi.

  16. 00

    Obi-Wan Kenobi

    dijo:

    Firefox 40.0 Ubuntu 14.04

    @Henryk
    La experiencia también es una fuente :D.

Deja un comentario

Tu dirección de correo electrónico nunca será compartida.