¿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 ?

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

  • virtualenv es una herramienta muy popular que crea entornos aislados de Python para las bibliotecas de Python. Si no está familiarizado con esta herramienta, le recomiendo que la aprenda, ya que es una herramienta muy útil y haré comparaciones con ella por el rest de esta respuesta.

    Funciona al instalar una gran cantidad de archivos en un directorio (por ejemplo: env/ ), y luego modificar la PATH entorno PATH para prefijarlo con un directorio bin personalizado (por ejemplo: env/bin/ ). Una copia exacta del binario de python o python3 se coloca en este directorio, pero Python está progtwigdo para buscar bibliotecas relativas a su ruta primero, en el directorio de entorno. No es parte de la biblioteca estándar de Python, pero está oficialmente bendecida por PyPA (Python Packaging Authority). Una vez activado, puede instalar paquetes en el entorno virtual usando 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 activada, prefija la PATH 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 se ejecutará según la variable de entorno PYENV_VERSION , el archivo .python-version o el archivo ~/.pyenv/version . 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 complemento para pyenv por el mismo autor que pyenv , para permitirle usar pyenv y virtualenv al mismo tiempo de manera conveniente. Sin embargo, si está utilizando Python 3.3 o posterior, pyenv-virtualenv intentará ejecutar python -m venv si está disponible, en lugar de virtualenv . Puede usar virtualenv y pyenv juntos sin pyenv-virtualenv , si no desea las características de conveniencia.

  • virtualenvwrapper es un conjunto de extensiones para virtualenv (ver documentos ). Le proporciona comandos como mkvirtualenv , lssitepackages y, especialmente, trabajo para cambiar entre diferentes directorios de virtualenv . Esta herramienta es especialmente útil si desea múltiples directorios virtualenv .

  • pyenv-virtualenvwrapper es un complemento para pyenv del mismo autor que pyenv , para integrar convenientemente virtualenvwrapper en pyenv .

  • pipenv , de Kenneth Reitz (el autor de las requests ), es el proyecto más nuevo en esta lista. Su objective es combinar Pipfile , pip y virtualenv en un solo 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 normalmente se encuentra en el directorio de trabajo actual.

    La Guía de empaquetado de Python recomienda pipenv al desarrollar aplicaciones de Python (a diferencia de las bibliotecas). No parece haber ningún plan para admitir venv lugar de virtualenv ( # 15 ). Confusamente, su opción de línea de comandos --venv refiere al directorio virtualenv , no a venv , y de manera similar, la variable de entorno PIPENV_VENV_IN_PROJECT afecta a la ubicación del directorio virtualenv , no venv directorio de venv ( # 1919 ).

Biblioteca estándar:

  • pyvenv es una secuencia de comandos incluida con Python 3, pero está obsoleta en Python 3.6 ya que tuvo problemas (por no mencionar el nombre confuso). En Python 3.6+, el equivalente exacto es python3 -m venv .

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

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

Recomendación para principiantes:

Esta 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 seleccione las otras herramientas una vez que empiece a necesitarlas.

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

 $ python3 -m venv  

virtualenv intenta copiar el binario de Python en el directorio bin del entorno virtual. Sin embargo, no actualiza los enlaces de los archivos de la biblioteca incrustados en ese binario, por lo que si construye Python desde la fuente en un directorio que no es de sistema con nombres de ruta relativos, el binario de Python se rompe. Dado que esta es la forma de hacer una copia distribuible de Python, es un gran defecto. Por cierto, para inspeccionar los enlaces de los archivos de la biblioteca incorporada en OS X, use otool . Por ejemplo, dentro de 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 ser usado a menudo donde se usa virtualenv pero también me mantendría alejado de él, ya que creo que venv también hace lo que pyenv está diseñado para.

venv crea entornos virtuales en el shell que están frescos y en espacio aislado , con bibliotecas instalables por el usuario , y es seguro para múltiples pitones . Nuevo porque los entornos virtuales solo comienzan con las bibliotecas estándar que se suministran con Python, debe instalar cualquier otra biblioteca de nuevo con pip install mientras el entorno virtual está activo. En la zona de pruebas 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 afectar su instalación básica 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á permisos de sudo para instalar bibliotecas en él. Finalmente, es seguro para múltiples pitones , ya que cuando los entornos virtuales se activan, el shell solo ve la versión de python (3.4, 3.5, etc.) que se usó para construir ese entorno virtual.

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

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