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

1028

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?

Flimm
fuente
21
Y para evitar los votos cerrados, sentí que esta era una pregunta más general que stackoverflow.com/questions/29950300/… , por lo que no me sentí cómodo editando esa pregunta o publicando una respuesta demasiado general en esa publicación.
Flimm
12
Esta guía es útil y se actualiza constantemente, ya que Python continúa agregando más y más "una y única forma obvia" de hacer las cosas: docs.python-guide.org/en/latest/dev/virtualenvs
michael
2
A partir de 3.6 me resultó más fácil hacer que virtualenv funcione en comparación con pyenv en macOS (I'm a pyNoob)
HashRocketSyntax
@HashRocketSyntax virtualenvy pyenvno realizan la misma función, y no son alternativas entre sí. Mira mi respuesta.
Flimm
77
Quemé un día entero perdiendo el tiempo con pipenv. En pocas palabras, está sobremarcado. Venv y virtualenv si necesita py2 son las herramientas adecuadas. Conda (miniconda si no necesitas el stack completo) también es muy bueno. Muy buen artículo: chriswarrick.com/blog/2018/07/17/…
SwimBikeRun

Respuestas:

1384

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

  • virtualenves una herramienta muy popular que crea entornos aislados de Python para bibliotecas de 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 la PATHvariable de entorno para prefijarlo con un bindirectorio personalizado (por ejemplo:) env/bin/. Se coloca una copia exacta del pythono python3binario 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 mediante pip.

  • pyenvse utiliza para aislar versiones de Python. Por ejemplo, es posible que desee probar su código con Python 2.7, 3.6, 3.7 y 3.8, por lo que necesitará 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 según 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, utilizando el comando pyenv install.

  • pyenv-virtualenves un complemento para pyenvel mismo autor que pyenv, para permitirle usar pyenvy virtualenval mismo tiempo convenientemente. Sin embargo, si está utilizando Python 3.3 o posterior, pyenv-virtualenvintentará ejecutarlo python -m venvsi está disponible, en lugar de hacerlo virtualenv. Puede usar virtualenvy pyenvjuntos sin pyenv-virtualenv, si no desea las funciones de conveniencia.

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

  • pyenv-virtualenvwrapperes un plugin para pyenvel mismo autor que pyenv, para integrar convenientemente virtualenvwrapperen pyenv.

  • pipenvpretende combinar Pipfile, pipy virtualenven un comando en la línea de comandos. El virtualenvdirectorio generalmente 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 está típicamente en el directorio de trabajo actual. pipenvestá destinado a usarse al desarrollar aplicaciones de Python (a diferencia de las 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:

  • pyvenves 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 es python3 -m venv.

  • venves un paquete enviado con Python 3, que puede 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). Sirve para el mismo propósito 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.

Recomendación para principiantes:

Esta es mi recomendación personal para principiantes: comience por aprender 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.

Flimm
fuente
116
¡Esto es muy útil! Entonces, ¿por qué hay 8 cosas enredadas en lugar de 1? ("Debe haber una, y preferiblemente una sola forma obvia de hacerlo". - El Zen de Python)
Jerry101
6060
@ Jerry101, la introducción de venv es en parte una respuesta a ese desastre. Si desea ayudar a mejorar la situación, le sugiero que use venv y anime a otros a hacer lo mismo.
Magnus Lind Oxlund
31
"la introducción de venv es en parte una respuesta a ese desastre" ¿Cómo es que cuando hay demasiadas cosas que hacen 'algo así como X', las personas siempre piensan que pueden mejorar ese desastre haciendo otra cosa que haga 'algo así como X'? . Es un poco divertido en realidad. Ahora estamos 4 años después ... así que puede ser pertinente preguntar, ¿ venvrealmente resolvió ese problema?
Kris
35
Las únicas dos herramientas en la lista que realmente cubren lo que posiblemente sea el mismo territorio son virtualenv y venv, por lo que la caracterización de que estamos lidiando con un desastre causado por varias herramientas de la competencia no es muy precisa. Sin embargo, la lista consta de varias herramientas relacionadas con el entorno virtual, todas con nombres similares. Eso puede ser confuso, especialmente para los usuarios que solo están aprendiendo sobre ellos. ¿Venv mejoró la situación? Ofreció una alternativa más ligera a otras herramientas de entorno virtual, beneficiándose de modificaciones nativas y un lugar en la biblioteca estándar. …
Magnus Lind Oxlund
11
@cowbert Después de actualizar de Python 3.5 a Python 3.6 y tener todos mis virtualenvs rotos, parece que venvte permite actualizar a una nueva versión de Python más fácilmente.
Daniel H
277

Simplemente evitaría el uso de virtualenvdespués de Python3.3 + y en su lugar usaría la biblioteca estándar enviada 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 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 virtualenvwrappery pipenv. pyvenves obsoleto. pyenvParece que se usa a menudo donde virtualenvse usa, pero también me mantendría alejado de él, ya que creo que venvtambién hace para lo que pyenvestá diseñado.

venvcrea 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 nuevamente cualquier otra biblioteca pip installmientras el entorno virtual esté activo. Sandboxed porque ninguna de estas nuevas instalaciones de la 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 sinsudoen algún directorio que ya posee, por lo que no necesitará sudopermisos para instalar bibliotecas en él. Finalmente, es seguro para múltiples python , ya que cuando se activan entornos virtuales, el shell solo ve la versión de python (3.4, 3.5, etc.) que se utilizó para construir 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. Así que creo que también es mejor usarlo venv.

En los últimos años, he encontrado muchos problemas en los sistemas de compilación (paquetes de emacs, constructores de aplicaciones independientes de Python, instaladores ...) que finalmente tienen problemas virtualenv. Creo que Python será una mejor plataforma cuando eliminemos esta opción adicional y solo la usemos venv.

Riaz Rizvi
fuente
3
add2virtualenvmodifica su PYTHONPATHagregando un _virtualenv_path_extensions.ptharchivo personalizado debajo site-packages. Alternativamente, puede actualizar la PYTHONPATHvariable de entorno en el bin/activatearchivo al que llama cada vez que activa el entorno virtual. O puede agregar enlaces simbólicos debajo site-packagespara señalar los directorios adicionales. Ambas alternativas son más transparentes a las herramientas de línea de comandos tradicionales que los desarrolladores utilizan ampliamente para solucionar problemas. El uso de una costumbre .pthcon un nombre indocumentado, hace que parezca más IMO mágico.
Riaz Rizvi
15
Bien, entonces he confirmado en stackoverflow.com/questions/48130371/... que una actualización correcta PYTHONPATHelimina la necesidad de hacerlo add2virtualenv. Con respecto a la falta de ayuda en SO desde su primer comentario, mi única sugerencia es que vote de manera positiva si solucionan su problema, para motivar a las personas a que lo solucionen cuando publica ¿Media hora de investigación + redacción a cambio de un clic del mouse? Suena como un buen intercambio ...
Riaz Rizvi
77
No, tienes razón: trato de ser bueno con la votación. Demonios, si estuvieras en mi área, te compraría una cerveza. Cumpliré mi promesa y veré si la gente de doc. De Python me permitirá agregar el cambio a / bin / activar los documentos oficiales para mayor claridad. Aunque no soy genial, no soy horrible con Python. Si fue difícil para mí ... De todos modos, gracias por tu tiempo, te deseo lo mejor.
SteveJ
99
@ MalikA.Rumi, la bendición se ha reducido ligeramente a "el creador de Pipenv nos vendió diligentemente a nosotros y a otros, por eso mencionamos a Pipenv".
Rob Grant
66
@AndreaMoro Es pyvenvque está en desuso, no pyenv. Es muy fácil confundirse con los nombres de estas herramientas.
Daniel Holmes
25

He bajado por la pipenvmadriguera del conejo (de hecho es una madriguera profunda y oscura ... ) y desde que la última respuesta fue hace más de 2 años , sentí que era útil actualizar la discusión con los últimos desarrollos sobre el tema de sobres virtuales de Python I Lo he encontrado.

DESCARGO DE RESPONSABILIDAD:

Esta respuesta es NO sobre la continuación de la discusión que rabia sobre los méritos de pipenv frente Venv como sobre soluciones- me hacen ningún endoso de cualquiera . Se trata de que PyPA respalde estándares conflictivos y de cómo el desarrollo futuro de virtualenv promete negar la elección de uno u otro. Me concentré 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 crear SOBRES 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 usar para crear sobres virtuales, pero adicionalmente incluye la administración de paquetes y lafuncionalidad de comprobación de vulnerabilidades . En lugar de usarrequirements.txt,pipenvofrece administración de paquetes a través de Pipfile . Como PyPA respalda pipenv para la GESTIÓN DE PAQUETES , eso parece implicar quepipfilees suplantarrequirements.txt .

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

Estándares en conflicto:

Entonces, si decidirse por una solución de sobre virtual no fue lo suficientemente difícil, ahora tenemos PyPA que respalda dos herramientas diferentes que usan 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 de Github al que se hace referencia en el enlace anterior ha dirigido el desarrollo virtualenv en la dirección de acomodar venv en futuras versiones :

preferir venv incorporado: si el python objetivo tiene venv crearemos el entorno utilizando eso (y luego realizaremos operaciones posteriores para facilitar otras garantías que ofrecemos)

Conclusión:

Por lo tanto, parece que habrá una convergencia futura entre las dos soluciones de envoltura virtual rivales, pero a partir de ahora pipenv , que utiliza virtualenv, varía materialmente 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 .

F1Linux
fuente
66
Por lo que he entendido: el valor real de pipenv ya se ha debatido durante un tiempo y no se ha lanzado en más de un año. Muchas cosas han cambiado desde entonces, y diría que solo empeoró para pipenv (las herramientas como la poesía y las herramientas de pepita están en una forma mucho mejor). Las páginas de PyPA están desactualizadas, y diría que deberían degradar pipenv . venv es una herramienta estándar y, como tal, es muy eficiente pero tiene un conjunto limitado de características. virtualenv no compite con venv pero trata de cubrir las áreas donde venv no puede o no quiere ir (ya que es un estándar).
sinoroc
@sinoroc Mi mensaje no era sobre los méritos o pipenv., Se trataba de la orientación divergente del PyPA respaldando tanto pipenv Y Venv hacer la elección de una solución envolvente más difícil y la forma en que aparece un cierto grado de Converge negará la necesidad de elegir entre ellos en absoluto. Tenga en cuenta que no respaldo nada, solo compartí lo que aprendí sobre cómo están evolucionando estas dos soluciones respaldadas por PyPA . Dado el interés de PyPA en ellos, si me gusta o no se vuelve irrelevante: pipenv y Venv parecían propensos a convertirse en una parte del paisaje
F1Linux
99
Yo diría apegarse a venv y pip tanto como sea posible. Estos dos están aquí para quedarse, venv es parte de la biblioteca estándar de Python y, en cierto sentido, también pip , ya que está distribuido en Python (a través de surepip ). Las otras herramientas ( aparte de la serie pyenv : algo completamente diferente) parecen confiar o emular (con más o menos éxito) venv y pip . Lo cual es genial. Pero si las cosas van mal, venv y pip son la alternativa segura. La única otra herramienta que uso es tox (con tox-venv) para ayudar a crear y poblar los entornos virtuales (sencillo, sin magia, raro aún no se menciona).
sinoroc
3
Esta última publicación es dorada, ya que hizo un gran trabajo al eliminar las arrugas. Me apego a pip y venv ya que tuve problemas con los binarios colgantes usando virtualenv cuando se actualizó el sistema python.
codeviper
1
en el pasado me encontré con problemas con pipenv no verboso en errores. argl y zanja. También: chriswarrick.com/blog/2018/07/17/…
qrtLs
4

Actualización de abril de 2020

Estaba buscando lo mismo cuando me encontré con esta publicación . Creo que este problema de qué herramienta usar es bastante confuso y difícil para los nuevos usuarios de Python como yo. Esto es directamente desde el sitio web de PyPA con respecto a pipenv:

Si bien este tutorial cubre el proyecto pipenv como una herramienta que se enfoca principalmente en las necesidades del desarrollo de aplicaciones Python en lugar del desarrollo de la biblioteca Python, el proyecto en sí está trabajando en varios problemas de proceso y mantenimiento que impiden la publicación de correcciones de errores y nuevas características ( con la totalidad de 2019 pasando sin un nuevo lanzamiento). Esto significa que en el corto plazo, pipenv todavía sufre de varias peculiaridades y problemas de rendimiento sin una línea de tiempo clara para la resolución de esos problemas.

Si bien este sigue siendo el caso, es probable que los encargados del mantenimiento del proyecto quieran investigar Otras herramientas para la gestión de la dependencia de aplicaciones para su uso en lugar de, o junto con, pipenv.

Suponiendo que el lanzamiento de pipenv en abril de 2020 se lleva a cabo según lo planeado, y el lanzamiento después de eso también sigue en camino, entonces esta advertencia en el tutorial se eliminará. Si esos lanzamientos no se mantienen en curso, el tutorial en sí se eliminará y se reemplazará con una página de discusión sobre las opciones de administración de dependencias disponibles.

Arnuld
fuente
Parece que pipenv está actualmente (es decir, en mayo de 2020) todavía en prelanzamiento para la versión de abril de 2020. Ver aquí .
andrewjames
Esto no responde la pregunta.
Flimm
Creo que @Flimm respondió bien las preguntas. Estaba respondiendo a la respuesta de F1Linux
F1Linux
1
Como de 4 de junio de 2020, el pipenvequipo ha lanzado 2 versiones a PyPI: 2020.5.28y, más recientemente, 2020.6.2: pypi.org/project/pipenv/#history
nonbeing