¿Cuál es la diferencia entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc.?


Python 3.3 incluye en su biblioteca estándar el nuevo paquete venv. ¿Qué hace y en qué se diferencia de todos los otros paquetes que parecen coincidir con la expresión regular (py)?(v|virtual|pip)?env?

Author: Flimm, 2017-01-10

2 answers

Paquetes PyPI que no están en la biblioteca estándar:

  • virtualenv es una herramienta muy popular que crea entornos Python aislados para bibliotecas Python. Si no estás familiarizado con esta herramienta, te recomiendo que la aprendas, ya que es una herramienta muy útil, y voy a hacer comparaciones con ella para el resto de esta respuesta.

    Funciona instalando un montón de archivos en un directorio (por ejemplo: env/), y luego modificando la variable de entorno PATH para prefijarlo con un directorio personalizado bin (por ejemplo: env/bin/). Una copia exacta del binario python o python3 se coloca en este directorio, pero Python está programado para buscar primero las bibliotecas relativas a su ruta, en el directorio environment. No es parte de la biblioteca estándar de Python, pero está oficialmente bendecida por la PyPA (Python Packaging Authority). Una vez activado, puede instalar paquetes en el entorno virtual utilizando pip.

  • pyenv se utiliza para aislar Versiones de Python. Por ejemplo, es posible que desee probar su código contra Python 2.6, 2.7, 3.3, 3.4 y 3.5, por lo que necesitará una forma de cambiar entre ellos. Una vez activado, antepone la variable de entorno PATH con ~/.pyenv/shims, donde hay archivos especiales que coinciden con los comandos de Python(python, pip). Estas no son copias de los comandos enviados por Python; son scripts especiales que deciden sobre la marcha qué versión de Python ejecutar en función de la variable de entorno PYENV_VERSION, o el archivo .python-version, o la ~/.pyenv/version archivo. pyenv también facilita el proceso de descarga e instalación de varias versiones de Python, utilizando el comando pyenv install.

  • pyenv-virtualenv es un plugin para pyenv del mismo autor que pyenv, para permitirle usar pyenv y virtualenv al mismo tiempo convenientemente. Sin embargo, si está utilizando Python 3.3 o posterior, pyenv-virtualenv intentará ejecutar python -m venv si está disponible, en lugar de virtualenv. Puedes usar virtualenv y pyenv juntos sin pyenv-virtualenv, si no quieres el características de conveniencia.

  • virtualenvwrapper es un conjunto de extensiones a virtualenv (ver docs). Te da comandos como mkvirtualenv, lssitepackages, y especialmente workon para cambiar entre diferentes directorios virtualenv. Esta herramienta es especialmente útil si desea múltiples directorios virtualenv.

  • pyenv-virtualenvwrapper es un plugin para pyenv por el mismo autor como pyenv, convenientemente para integrar virtualenvwrapper en pyenv.

  • pipenv, por Kenneth Reitz (el autor de requests), es el proyecto más reciente en esta lista. Su objetivo es combinar Pipfile, pip y virtualenv en un comando en la línea de comandos. El directorio virtualenv normalmente se coloca en ~/.local/share/virtualenvs/XXX, siendo XXX un hash de la ruta del directorio del proyecto. Esto es diferente de virtualenv, donde el directorio se encuentra típicamente en el directorio de trabajo actual.

    La Guía de Empaquetado de Python recomienda pipenv al desarrollar Aplicaciones Python (a diferencia de las bibliotecas). No parece que ser cualquier plan para apoyar venv en lugar de virtualenv (#15). Confusamente, su opción de línea de comandos --venv se refiere a la virtualenv directorio, no venv, y del mismo modo, el entorno variable PIPENV_VENV_IN_PROJECT afecta a la ubicación de la virtualenv directorio, no venv directorio (#1919).

Biblioteca estándar:

  • pyvenv es un script enviado con Python 3 pero obsoleto en Python 3.6 ya que tenía problemas (sin mencionar el nombre confuso). En Python 3.6+, el equivalente exacto es python3 -m venv.

  • venv es un paquete enviado con Python 3, que se puede ejecutar usando python3 -m venv (aunque por alguna razón algunas distribuciones lo separan en un paquete de distribución separado, como python3-venv en Ubuntu/Debian). Tiene un propósito similar a virtualenv, y funciona de una manera muy similar, pero no necesita copie los binarios de Python (excepto en Windows). Use esto si no necesita soportar Python 2. En el momento de escribir esto, la comunidad de Python parece estar contenta con virtualenv y no he oído hablar mucho de venv.

La mayoría de estas herramientas se complementan entre sí. Por ejemplo, pipenv integra pip, virtualenv e incluso pyenv si se desea. Las únicas herramientas que son verdaderas alternativas entre sí aquí son venv y virtualenv.

Recomendación para principiantes:

Esto es mi recomendación personal para principiantes: comience por aprender virtualenv y pip, herramientas que funcionan con Python 2 y 3 y en una variedad de situaciones, y recoja las otras herramientas una vez que comience a necesitarlas.

 572
Author: Flimm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 08:48:49

Simplemente evitaría el uso de virtualenv después de Python3.3+ y en su lugar usaría la biblioteca estándar enviada venv. Para crear un nuevo entorno virtual escribirías:

$ python3 -m venv <MYVENV>  

virtualenv intenta copiar el binario de Python en el directorio bin del entorno virtual. Sin embargo, no actualiza los enlaces de archivos de biblioteca incrustados en ese binario, por lo que si construye Python desde el código fuente en un directorio que no sea del sistema con nombres de ruta relativos, el binario de Python se rompe. Ya que así es como haces una copia python distribuible, es un gran defecto. Por cierto, para inspeccionar los enlaces de archivos de biblioteca incrustados en OS X, use otool. Por ejemplo, desde su entorno virtual, escriba:

$ otool -L bin/python
python:
    @executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

En consecuencia evitaría virtualenvwrapper y pipenv. pyvenv está en desuso. pyenv parece que se usa a menudo donde virtualenv se usa, pero me mantendría alejado de él también, ya que creo que venv también hace lo que pyenv está construido para.

venv crea entornos virtuales en el shell que son frescos y sandboxed, con bibliotecas instalables por el usuario, y es multi-python safe. Fresh dado que los entornos virtuales solo comienzan con las bibliotecas estándar que se incluyen con python, debe instalar cualquier otra biblioteca de nuevo con pip install mientras el entorno virtual esté activo. Sandboxed porque ninguna de estas nuevas instalaciones de biblioteca son visibles fuera del entorno virtual, por lo que puede eliminar todo el entorno y comenzar de nuevo sin preocuparse por impactar su instalación base de Python. Bibliotecas instalables por el usuario porque la carpeta de destino del entorno virtual se crea sin sudo en algún directorio que ya posee, por lo que no necesitará sudo permisos para instalar bibliotecas en él. Finalmente es multi-python safe, ya que cuando los entornos virtuales se activan, el shell solo ve la versión de python (3.4, 3.5, etc.).) que se utilizó para construir ese entorno virtual.

pyenv es similar a venv en el sentido de que le permite administrar múltiples entornos python. Sin embargo, con pyenv no puede revertir convenientemente las instalaciones de bibliotecas a algún estado de inicio y es probable que necesite admin privilegios en algún momento para actualizar las bibliotecas. Así que creo que también es mejor usar venv.

En los últimos años he encontrado muchos problemas en los sistemas de compilación (paquetes emacs, creadores de aplicaciones independientes de python, instaladores...) que en última instancia se reducen a problemas con virtualenv. Creo que python mejor plataforma cuando eliminamos esta opción adicional y solo usamos venv.

 80
Author: Riaz Rizvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 18:25:50