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

Resuelto Flimm asked hace 7 años • 8 respuestas

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

Flimm avatar Jan 10 '17 23:01 Flimm
Aceptado

Esta es mi recomendación personal para principiantes: comience aprendiendo virtualenvy pip, herramientas que funcionan con Python 2 y 3 y en una variedad de situaciones, y elija otras herramientas una vez que comience a necesitarlas.

Ahora pasemos a responder la pregunta: ¿cuál es la diferencia entre estas cosas con nombres similares: venv, virtualenv, etc.?

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

  • virtualenves 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.

    Funciona instalando un montón de archivos en un directorio (por ejemplo env/:) y luego modificando la PATHvariable de entorno para anteponerle un bindirectorio personalizado (por ejemplo env/bin/:). Se coloca una copia exacta del binario pythono python3en este directorio, pero Python está programado para buscar bibliotecas relativas a su ruta primero, en el directorio del entorno. No es parte de la biblioteca estándar de Python, pero está oficialmente bendecido por PyPA (Python Packaging Authority). Una vez activado, puede instalar paquetes en el entorno virtual usando pip.

  • pyenvse utiliza para aislar versiones de Python. Por ejemplo, es posible que quieras probar tu código con Python 2.7, 3.6, 3.7 y 3.8, por lo que necesitarás una forma de cambiar entre ellos. Una vez activado, antepone la PATHvariable de entorno 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 PYENV_VERSIONvariable de entorno, o el .python-versionarchivo, o el ~/.pyenv/versionarchivo. pyenvtambién facilita el proceso de descarga e instalación de múltiples versiones de Python, usando el comando pyenv install.

  • pyenv-virtualenves un complemento pyenvdel mismo autor que pyenvle permite usarlo pyenvy virtualenval mismo tiempo de manera conveniente. Sin embargo, si utiliza Python 3.3 o posterior, pyenv-virtualenvintentará ejecutarlo python -m venvsi está disponible, en lugar de virtualenv. Puede usar virtualenvy pyenvjuntos sin pyenv-virtualenv, si no desea las funciones convenientes.

  • virtualenvwrapperes un conjunto de extensiones para virtualenv(ver documentos ). Le brinda comandos como mkvirtualenv, lssitepackagesy especialmente workonpara cambiar entre diferentes virtualenvdirectorios. Esta herramienta es especialmente útil si desea varios virtualenvdirectorios.

  • pyenv-virtualenvwrapperes un complemento pyenvdel mismo autor que pyenvse integra cómodamente virtualenvwrapperen pyenv.

  • pipenvtiene como objetivo combinar Pipfiley pipen virtualenvun solo comando en la línea de comandos. El virtualenvdirectorio normalmente se coloca en ~/.local/share/virtualenvs/XXX, XXXsiendo un hash de la ruta del directorio del proyecto. Esto es diferente de virtualenv, donde el directorio suele estar en el directorio de trabajo actual. pipenvestá destinado a usarse al desarrollar aplicaciones Python (a diferencia de bibliotecas). Hay alternativas a pipenv, como poetry, que no enumeraré aquí ya que esta pregunta es solo sobre los paquetes que tienen nombres similares.

Biblioteca estándar:

  • pyvenv(que no debe confundirse con el pyenvde la sección anterior) es un script que se incluye con Python 3.3 a 3.7. Se eliminó de Python 3.8 porque tenía problemas (sin mencionar el nombre confuso). Correr python3 -m venvtiene exactamente el mismo efecto que pyvenv.

  • venves un paquete incluido con Python 3, que puedes ejecutar usando python3 -m venv(aunque por alguna razón algunas distribuciones lo separan en un paquete de distribución separado, como python3-venven Ubuntu/Debian). Tiene el mismo propósito que virtualenv, pero solo tiene un subconjunto de sus características ( vea una comparación aquí ). virtualenvsigue siendo más popular que venv, especialmente porque el primero es compatible con Python 2 y 3.

Flimm avatar Jan 10 '2017 16:01 Flimm

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

$ python3 -m venv <MYVENV>  

virtualenvintenta 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 compila Python desde el origen en un directorio que no es del sistema con nombres de ruta relativos, el binario de Python se rompe. Dado que así es como se hace una copia distribuible de Python, es un gran defecto. Por cierto, para inspeccionar los enlaces de archivos de bibliotecas integradas en OS X, utilice 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 virtualenvwrappery pipenv. pyvenves obsoleto. pyenvParece que se usa con frecuencia donde virtualenvse usa, pero también me mantendría alejado de él, ya que creo que venvtambién sirve pyenvpara lo que está diseñado.

venvcrea entornos virtuales en el shell que son nuevos y protegidos , con bibliotecas instalables por el usuario y es seguro para múltiples Python .

Nuevo : debido a que los entornos virtuales solo comienzan con las bibliotecas estándar que se incluyen con Python, debe instalar cualquier otra biblioteca nuevamente pip installmientras el entorno virtual está activo.

Sandboxed : debido a que ninguna de estas nuevas instalaciones de bibliotecas es visible fuera del entorno virtual, puede eliminar todo el entorno y comenzar de nuevo sin preocuparse por afectar su instalación base de Python.

Bibliotecas instalables por el usuario : debido a que la carpeta de destino del entorno virtual se crea sudoen algún directorio que ya posee, no necesitará sudopermisos para instalar bibliotecas en ella.

Seguro para múltiples Python : porque cuando se activan los entornos virtuales, el shell solo ve la versión de Python (3.4, 3.5, etc.) que se utilizó para crear ese entorno virtual.

pyenves similar a venvque le permite administrar múltiples entornos de Python. Sin embargo, pyenvno puede revertir cómodamente las instalaciones de la biblioteca a algún estado de inicio y es probable que necesite adminprivilegios en algún momento para actualizar las bibliotecas. Por eso creo que también es mejor utilizar venv.

En los últimos años he encontrado muchos problemas en los sistemas de compilació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 eliminemos esta opción adicional y solo usemos venv.

EDITAR: Tweet de la BDFL,

Utilizo venv (en stdlib) y un montón de alias de shell para cambiar rápidamente.

– Guido van Rossum (@gvanrossum) 22 de octubre de 2020

Rian Rizvi avatar Nov 29 '2017 19:11 Rian Rizvi

ACTUALIZACIÓN 2020-08-25:

Se agregó debajo del párrafo " Conclusión "

Me metí en la pipenvmadriguera del conejo ( es un agujero profundo y oscuro de hecho... ) y dado que la última respuesta es hace más de 2 años , sentí que era útil actualizar la discusión con los últimos desarrollos sobre el tema de los sobres virtuales de Python. he encontrado.

DESCARGO DE RESPONSABILIDAD:

Esta respuesta NO se trata de continuar el furioso debate sobre los méritos de pipenv versus venv como soluciones envolventes; no respaldo ninguna de las dos . Se trata de que PyPA respalde estándares conflictivos y de cómo el desarrollo futuro de virtualenv promete negar la posibilidad de elegir entre ellos. Me centré en estas dos herramientas precisamente porque son las ungidas por PyPA .


venv

Como señala el OP, venv es una herramienta para virtualizar entornos. NO es una solución de terceros, sino una herramienta nativa. PyPA respalda venv para la creación de SOBRE VIRTUALES : " Modificado en la versión 3.5: ahora se recomienda el uso de venv para crear entornos virtuales ".

pipenv

pipenv , al igual que venv , se puede utilizar para crear sobres virtuales pero, además, incluye funciones de gestión de paquetes y comprobación de vulnerabilidades . En lugar de utilizarrequirements.txt,pipenvofrece gestión de paquetes a través de Pipfile . Dado que PyPA respalda pipenv para la ADMINISTRACIÓN DE PAQUETES , eso parecería implicarpipfileque está reemplazandorequirements.txt.

SIN EMBARGO : pipenv usa virtualenv como herramienta para crear sobres virtuales, NO venv, que está respaldado por PyPA como herramienta de referencia para crear sobres virtuales.

Estándares en conflicto:

Entonces, si decidirse por una solución de sobre virtual no fuera lo suficientemente difícil, ahora tenemos a PyPA respaldando dos herramientas diferentes que utilizan diferentes soluciones de sobre virtual. El furioso debate de Github sobre venv vs virtualenv que destaca este conflicto se puede encontrar aquí .

La resolución de conflictos:

El debate sobre Github al que se hace referencia en el enlace anterior ha dirigido el desarrollo de virtualenv hacia la adaptación de venv en futuras versiones :

prefiera venv incorporado: si el Python de destino tiene venv, crearemos el entorno usándolo (y luego realizaremos operaciones posteriores en él para facilitar otras garantías que ofrecemos)


Conclusión:

Por lo tanto, parece que habrá cierta convergencia futura entre las dos soluciones de envolvente virtual rivales, pero a partir de ahora pipenv , que utiliza virtualenv, varía materialmente de venv.

Dados los problemas que resuelve pipenv y el hecho de que PyPA ha dado su bendición, parece tener un futuro brillante. Y si virtualenv cumple con los objetivos de desarrollo propuestos, elegir una solución de envolvente virtual ya no debería ser un caso de pipenv O venv .

Actualización 2020-08-25:

Una crítica repetida a Pipenv que vi al realizar este análisis fue que no se mantenía activamente. De hecho, ¿qué sentido tiene utilizar una solución cuyo futuro podría verse cuestionable debido a la falta de desarrollo continuo? Después de un período de sequía de aproximadamente 18 meses, Pipenv una vez más se está desarrollando activamente. De hecho, desde entonces se han publicado actualizaciones importantes y sustanciales .

F1Linux avatar Jan 26 '2020 22:01 F1Linux