¿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 demás paquetes que coinciden con la expresión regular (py)?(v|virtual|pip)?env
?
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 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:
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.Funciona instalando un montón de archivos en un directorio (por ejemplo
env/
:) y luego modificando laPATH
variable de entorno para anteponerle unbin
directorio personalizado (por ejemploenv/bin/
:). Se coloca una copia exacta del binariopython
opython3
en 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 usandopip
.pyenv
se 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 laPATH
variable 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 laPYENV_VERSION
variable de entorno, o el.python-version
archivo, o el~/.pyenv/version
archivo.pyenv
también facilita el proceso de descarga e instalación de múltiples versiones de Python, usando el comandopyenv install
.pyenv-virtualenv
es un complementopyenv
del mismo autor quepyenv
le permite usarlopyenv
yvirtualenv
al mismo tiempo de manera conveniente. Sin embargo, si utiliza Python 3.3 o posterior,pyenv-virtualenv
intentará ejecutarlopython -m venv
si está disponible, en lugar devirtualenv
. Puede usarvirtualenv
ypyenv
juntos sinpyenv-virtualenv
, si no desea las funciones convenientes.virtualenvwrapper
es un conjunto de extensiones paravirtualenv
(ver documentos ). Le brinda comandos comomkvirtualenv
,lssitepackages
y especialmenteworkon
para cambiar entre diferentesvirtualenv
directorios. Esta herramienta es especialmente útil si desea variosvirtualenv
directorios.pyenv-virtualenvwrapper
es un complementopyenv
del mismo autor quepyenv
se integra cómodamentevirtualenvwrapper
enpyenv
.pipenv
tiene como objetivo combinarPipfile
ypip
envirtualenv
un solo comando en la línea de comandos. Elvirtualenv
directorio normalmente se coloca en~/.local/share/virtualenvs/XXX
,XXX
siendo un hash de la ruta del directorio del proyecto. Esto es diferente devirtualenv
, donde el directorio suele estar en el directorio de trabajo actual.pipenv
está destinado a usarse al desarrollar aplicaciones Python (a diferencia de bibliotecas). Hay alternativas apipenv
, comopoetry
, 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 elpyenv
de 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). Correrpython3 -m venv
tiene exactamente el mismo efecto quepyvenv
.venv
es un paquete incluido con Python 3, que puedes ejecutar usandopython3 -m venv
(aunque por alguna razón algunas distribuciones lo separan en un paquete de distribución separado, comopython3-venv
en Ubuntu/Debian). Tiene el mismo propósito quevirtualenv
, pero solo tiene un subconjunto de sus características ( vea una comparación aquí ).virtualenv
sigue siendo más popular quevenv
, especialmente porque el primero es compatible con Python 2 y 3.
Simplemente evitaría el uso de virtualenv
Python3.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>
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 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 virtualenvwrapper
y pipenv
. pyvenv
es obsoleto. pyenv
Parece que se usa con frecuencia donde virtualenv
se usa, pero también me mantendría alejado de él, ya que creo que venv
también sirve pyenv
para lo que está diseñado.
venv
crea 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 install
mientras 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 sudo
en algún directorio que ya posee, no necesitará sudo
permisos 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.
pyenv
es similar a venv
que le permite administrar múltiples entornos de Python. Sin embargo, pyenv
no puede revertir cómodamente las instalaciones de la biblioteca a algún estado de inicio y es probable que necesite admin
privilegios 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
ACTUALIZACIÓN 2020-08-25:
Se agregó debajo del párrafo " Conclusión "
Me metí en la pipenv
madriguera 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
,pipenv
ofrece gestión de paquetes a través de Pipfile . Dado que PyPA respalda pipenv para la ADMINISTRACIÓN DE PAQUETES , eso parecería implicarpipfile
que 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 .