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 laPATH
entornoPATH
para prefijarlo con un directoriobin
personalizado (por ejemplo:env/bin/
). Se coloca una copia exacta del binariopython
opython3
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 utilizandopip
. -
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 laPATH
entornoPATH
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 entornoPYENV_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 comandopyenv install
. -
pyenv-virtualenv
es un complemento parapyenv
del mismo autor quepyenv
, para permitirle usarpyenv
yvirtualenv
al mismo tiempo de manera conveniente. Sin embargo, si está utilizando Python 3.3 o posterior,pyenv-virtualenv
intentará ejecutarpython -m venv
si está disponible, en lugar devirtualenv
. Puede usarvirtualenv
ypyenv
juntos sinpyenv-virtualenv
, si no desea las funciones de conveniencia. -
virtualenvwrapper
es un conjunto de extensiones devirtualenv
(ver docs ). Le proporciona comandos comomkvirtualenv
,lssitepackages
y, especialmente, trabajo para cambiar entre diferentes directoriosvirtualenv
. Esta herramienta es especialmente útil si desea múltiples directoriosvirtualenv
. -
pyenv-virtualenvwrapper
es un complemento parapyenv
del mismo autor quepyenv
, para integrar convenientementevirtualenvwrapper
enpyenv
. -
pipenv
, de Kenneth Reitz (el autor de lasrequests
), es el proyecto más nuevo en esta lista. Su objetivo es combinarPipfile
,pip
yvirtualenv
en un comando en la línea de comandos. El directoriovirtualenv
generalmente se coloca en~/.local/share/virtualenvs/XXX
, conXXX
como un hash de la ruta del directorio del proyecto. Esto es diferente devirtualenv
, 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 admitirvenv
lugar devirtualenv
( #15 ). Confusamente, su opción de línea de comandos--venv
refiere al directoriovirtualenv
, no avenv
, y de manera similar, la variable de entornoPIPENV_VENV_IN_PROJECT
afecta la ubicación del directoriovirtualenv
, no el directoriovenv
( #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 espython3 -m venv
. -
venv
es un paquete que se envía con Python 3, que puede 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 un propósito similar avirtualenv
, 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 convirtualenv
y no he oído hablar mucho devenv
.
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
.