venv myenv make deploy create python virtualenv virtualenvwrapper pyenv python-venv

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



pipenv ubuntu (2)

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á familiarizado con esta herramienta, le recomiendo que la aprenda, ya que es una herramienta muy útil, y haré comparaciones con ella para el resto de esta respuesta.

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

  • pyenv se usa para aislar versiones de Python. Por ejemplo, es posible que desee probar su código con 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 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 ejecutar en función de la variable de entorno PYENV_VERSION , o el archivo .python-version , o el archivo ~/.pyenv/version . pyenv también facilita el proceso de descarga e instalación de múltiples versiones de Python, utilizando el comando pyenv install .

  • pyenv-virtualenv es un complemento para pyenv del 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 funciones de conveniencia.

  • virtualenvwrapper es un conjunto de extensiones de virtualenv (ver docs ). Le proporciona comandos como mkvirtualenv , lssitepackages y, especialmente, trabajo para cambiar entre diferentes directorios 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 objetivo es combinar Pipfile , pip y virtualenv en un comando en la línea de comandos. El directorio virtualenv generalmente se coloca en ~/.local/share/virtualenvs/XXX , con XXX como un hash de la ruta del directorio del proyecto. Esto es diferente de virtualenv , donde el directorio está típicamente 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 la ubicación del directorio virtualenv , no el directorio venv ( #1919 ).

Biblioteca estándar:

  • pyvenv es un script enviado con Python 3 pero desaprobado 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 que se envía con Python 3, que 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 manera muy similar, pero no necesita copiar binarios de Python (excepto en Windows). Use esto si no necesita admitir Python 2. Al momento de escribir, 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 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 aprendiendo 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.

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


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

$ 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 la biblioteca incrustados en ese binario, por lo que si construye Python desde la fuente en un directorio que no sea del sistema con nombres de ruta relativos, el binario de Python se rompe. Como así es como se hace una copia distribuible de Python, es un gran defecto. Por cierto, para inspeccionar 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 usarse a menudo donde se usa virtualenv pero también me mantendría alejado de él, ya que creo que venv también hace para lo que está diseñado pyenv .

venv crea entornos virtuales en el shell que son frescos y de espacio aislado , con bibliotecas instalables por el usuario , y es seguro para múltiples python . Fresco porque los entornos virtuales solo comienzan con las bibliotecas estándar que se envían con python, debe instalar cualquier otra biblioteca nuevamente con la pip install mientras el entorno virtual está activo. Sandboxed porque ninguna de estas nuevas instalaciones de biblioteca es visible fuera del entorno virtual, por lo que puede eliminar todo el entorno y comenzar de nuevo sin preocuparse por afectar la instalación de Python base. 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 python , 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 que le permite administrar múltiples entornos python. Sin embargo, con pyenv no puede revertir cómodamente 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 años, he encontrado muchos problemas en los sistemas de compilación (paquetes emacs, constructores de aplicaciones independientes de Python, instaladores ...) que finalmente se reducen a problemas con virtualenv . Creo que Python será una mejor plataforma cuando venv esta opción adicional y solo usemos venv .