¿Cuál es la relación entre virtualenv y pyenv?

175

Recientemente aprendí a usar virtualenv y virtualenvwrapper en mi flujo de trabajo, pero he visto a pyenv mencionado en algunas guías, pero parece que no puedo entender qué es pyenv y cómo es diferente / similar a virtualenv. ¿Es pyenv un reemplazo mejor / más nuevo para virtualenv o una herramienta complementaria? Si es lo último, ¿qué hace de manera diferente y cómo funcionan los dos (y virtualenvwrapper si corresponde)?

verdad1ness
fuente
3
fgimian.github.io/blog/2014/04/20/… : Sin embargo, hay otra alternativa llamada pyenv que tiene varias ventajas significativas .
Martijn Pieters
11
No seas como yo y no te pyenvconfundas conpyvenv
Usuario

Respuestas:

162

Pyenv y virtualenv son herramientas muy diferentes que funcionan de diferentes maneras para hacer diferentes cosas:

  • Pyenv es una extensión bash, no funcionará en Windows, que intercepta sus llamadas a python, pip, etc., para dirigirlas a una de las varias cadenas de herramientas de python del sistema. Por lo tanto, siempre tiene disponibles todas las bibliotecas que ha instalado en la versión seleccionada de Python, por lo que es bueno para los usuarios que tienen que cambiar entre diferentes versiones de Python.

  • VirtualEnv , es Python puro, por lo que funciona en todas partes, hace una copia de, opcionalmente , una versión específica de Python y Pip local para el entorno de activación que puede incluir o no enlaces a la cadena de herramientas del sistema actual, si no puede instale solo un subconjunto conocido de bibliotecas en ese entorno. Como tal, es casi seguro que sea mucho mejor para las pruebas y la implementación, ya que sabe exactamente qué bibliotecas, en qué versiones se usan y un cambio global no afectará su módulo.

venv python> 3.3

Tenga en cuenta que desde Python 3.3 en adelante hay una implementación integrada de VirtualEnv llamada venv (con, en algunas instalaciones, un contenedor llamado pyvenv; este contenedor está en desuso en Python 3.6 ), que probablemente debería usarse con preferencia. Para evitar posibles problemas con el contenedor, a menudo es una buena idea usarlo directamente usando /path/to/python3 -m venv desired/env/patho puede usar el excelente pyselector de python en ventanas con py -3 -m venv desired/env/path. Creará el directorio especificado con desired/env/pathconfigure y lo completará adecuadamente. En general, es muy parecido a usar VirtualEnv.

Herramientas adicionales

Hay varias herramientas que vale la pena mencionar y considerar, ya que pueden ayudar con el uso de uno o más de los anteriores:

  • VirtualEnvWrapper Administre y simplifique el uso y la administración de VirtualEnv - Cross Platform .
  • pyenv-virtualenv , instalado por pyenv-installer , que proporciona herramientas PyEnv para administrar e interactuar con VirtualEnv, con esto puede tener una instalación base que incluye más de una versión de python y crear entornos aislados dentro de cada uno de ellos ( Linux / OS) X . Sugerido por Johann Visagie
  • PyInstaller puede tomar su código de Python, posiblemente desarrollado y probado bajo VirtualEnv, y agruparlo para que pueda ejecutar una plataforma que no tenga instalada su versión de Python: tenga en cuenta que no es un compilador cruzado, necesitará un Windows (virtual -) máquina para construir instalaciones de Windows, etc., pero puede ser útil incluso donde puede estar seguro de que se instalará python pero no puede estar seguro de que la versión de python y todas las bibliotecas sean compatibles con su código.
Steve Barnes
fuente
3
Probablemente valga la pena mencionar pyenv-virtualenv, un complemento de pyenv que permite que pyenv y virtualenv funcionen sin problemas al unísono. Si ha instalado pyenv usando pyenv-installer, pyenv-virtualenv ya estará presente. * github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer
wjv
1
¿Qué pasa venv, ahora en la biblioteca estándar?
Flimm
@Flimm: desde python 3.3 en adelante, venv es parte de la biblioteca estándar y debe usarse en lugar de virtualenv, ya que a menudo se describe como "virtualenv hecho bien" - reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv
Steve Barnes
2
pyenv-virtualenv no es (o al menos ya no es) solo Linux. Hay un paquete homebrew para una fácil instalación en MacOS.
Gire el
¡Gracias por destacar la interoperabilidad!
HashRocketSyntax
16

virtualenvle permite crear una instalación personalizada de Python, por ejemplo, en un subdirectorio de su proyecto. Cada uno de sus proyectos puede tener su propio python(o incluso varios) bajo su respectivo virtualenv. Está perfectamente bien que algunos / todos los virtualenvs tengan incluso la misma versión de python(por ejemplo, 2.7.16) sin conflicto: viven por separado y no se conocen entre sí. Si desea usar cualquiera de esos pythons, debe activatehacerlo (ejecutando un script que modificará temporalmente su PATHpara asegurarse de que el bin/directorio de virtualenv sea ​​lo primero). A partir de ese momento, llamar python(o pipetc.) invocará la versión de ese virtualenv hasta que deactivatelo restablezca PATH.

pyenvopera en una escala más amplia que virtualenv: contiene un registro de las instalaciones de Python (y puede usarse para instalar otras nuevas) y le permite configurar qué versión de Python ejecutar cuando usa el pythoncomando. Suena similar pero el uso práctico es un poco diferente. Funciona anteponiendo su pythonscript shim a su PATH(permanentemente) y luego decidiendo qué "real" pythoninvocar. Incluso puede configurar pyenv para llamar a una de sus pitones virtualenv (utilizando el pyenv-virtualenvcomplemento). Las versiones de Python que instala usando pyenvvan a su $(pyenv root)/versions/directorio (por defecto, la raíz de pyenv es ~ / .pyenv), por lo que son más 'globales' que virtualenv. Por lo general, no puede duplicar las versiones de Python instaladas pyenv, al menos no es la idea principal.

Para crear un virtualenv con una versión específica de Python, necesita tener esa versión en algún lugar de su sistema (ya sea en el PATHo no) y esencialmente clonarla en su virtualenv recién creado. Por supuesto, una forma de obtener una versión en particular es instalarla a través de pyenv. Una vez hecho esto, los virtualenvs individuales son libres de divergir al tener instalados diferentes módulos (o versiones de los mismos).

En breve:

  • virtualenv le permite crear instalaciones de python locales e independientes mediante la clonación de las existentes
  • pyenv le permite instalar diferentes versiones de python simultáneamente (ya sea en todo el sistema o solo para el usuario local) y luego elegir cuál de la multitud de pitones ejecutar en un momento dado (incluidas las creadas por virtualenv o Anaconda)
Błażej Czapp
fuente