¿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
?
2 answers
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, y voy a hacer comparaciones con ella para el resto de esta respuesta.Funciona instalando un montón de archivos en un directorio (por ejemplo:
env/
), y luego modificando la variable de entornoPATH
para prefijarlo con un directorio personalizadobin
(por ejemplo:env/bin/
). Una copia exacta del binariopython
opython3
se coloca en este directorio, pero Python está programado para buscar primero las bibliotecas relativas a su ruta, en el directorio environment. No es parte de la biblioteca estándar de Python, pero está oficialmente bendecida por la PyPA (Python Packaging Authority). Una vez activado, puede instalar paquetes en el entorno virtual utilizandopip
. 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 activado, antepone la variable de 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 la~/.pyenv/version
archivo.pyenv
también facilita el proceso de descarga e instalación de varias versiones de Python, utilizando el comandopyenv install
.pyenv-virtualenv
es un plugin parapyenv
del mismo autor quepyenv
, para permitirle usarpyenv
yvirtualenv
al mismo tiempo convenientemente. Sin embargo, si está utilizando Python 3.3 o posterior,pyenv-virtualenv
intentará ejecutarpython -m venv
si está disponible, en lugar devirtualenv
. Puedes usarvirtualenv
ypyenv
juntos sinpyenv-virtualenv
, si no quieres el características de conveniencia.virtualenvwrapper
es un conjunto de extensiones avirtualenv
(ver docs). Te da comandos comomkvirtualenv
,lssitepackages
, y especialmenteworkon
para cambiar entre diferentes directoriosvirtualenv
. Esta herramienta es especialmente útil si desea múltiples directoriosvirtualenv
.pyenv-virtualenvwrapper
es un plugin parapyenv
por el mismo autor comopyenv
, convenientemente para integrarvirtualenvwrapper
enpyenv
.-
pipenv
, por Kenneth Reitz (el autor derequests
), es el proyecto más reciente en esta lista. Su objetivo es combinarPipfile
,pip
yvirtualenv
en un comando en la línea de comandos. El directoriovirtualenv
normalmente se coloca en~/.local/share/virtualenvs/XXX
, siendoXXX
un hash de la ruta del directorio del proyecto. Esto es diferente devirtualenv
, donde el directorio se encuentra típicamente en el directorio de trabajo actual.La Guía de Empaquetado de Python recomienda
pipenv
al desarrollar Aplicaciones Python (a diferencia de las bibliotecas). No parece que ser cualquier plan para apoyarvenv
en lugar devirtualenv
(#15). Confusamente, su opción de línea de comandos--venv
se refiere a lavirtualenv
directorio, novenv
, y del mismo modo, el entorno variablePIPENV_VENV_IN_PROJECT
afecta a la ubicación de lavirtualenv
directorio, novenv
directorio (#1919).
Biblioteca estándar:
pyvenv
es un script enviado con Python 3 pero obsoleto 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 enviado con Python 3, que se 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 una manera muy similar, pero no necesita copie los binarios de Python (excepto en Windows). Use esto si no necesita soportar Python 2. En el momento de escribir esto, 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 se desea. Las únicas herramientas que son verdaderas alternativas entre sí aquí son venv
y virtualenv
.
Recomendación para principiantes:
Esto 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 recoja las otras herramientas una vez que comience a necesitarlas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 08:48:49
Simplemente evitaría el uso de virtualenv
después de Python3.3+ y en su lugar usaría la biblioteca estándar enviada venv
. Para crear un nuevo entorno virtual escribirías:
$ 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 biblioteca incrustados en ese binario, por lo que si construye Python desde el código fuente en un directorio que no sea del sistema con nombres de ruta relativos, el binario de Python se rompe. Ya que así es como haces una copia python distribuible, es un gran defecto. Por cierto, para inspeccionar los 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 que se usa a menudo donde virtualenv
se usa, pero me mantendría alejado de él también, ya que creo que venv
también hace lo que pyenv
está construido para.
venv
crea entornos virtuales en el shell que son frescos y sandboxed, con bibliotecas instalables por el usuario, y es multi-python safe. Fresh dado que los entornos virtuales solo comienzan con las bibliotecas estándar que se incluyen con python, debe instalar cualquier otra biblioteca de nuevo con pip install
mientras el entorno virtual esté activo. Sandboxed 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 impactar su instalación base 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á sudo
permisos para instalar bibliotecas en él. Finalmente es multi-python safe, 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 el sentido de que le permite administrar múltiples entornos python. Sin embargo, con pyenv
no puede revertir convenientemente las instalaciones de bibliotecas a algún estado de inicio y es probable que necesite admin
privilegios 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, creadores de aplicaciones independientes de python, instaladores...) que en última instancia se reducen a problemas con virtualenv
. Creo que python mejor plataforma cuando eliminamos esta opción adicional y solo usamos venv
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-21 18:25:50