¿Conda reemplaza la necesidad de virtualenv?

205

Recientemente descubrí a Conda después de tener problemas para instalar SciPy, específicamente en una aplicación Heroku que estoy desarrollando.

Con Conda creas entornos, muy similares a lo que hace virtualenv . Mis preguntas son:

  1. Si uso Conda, ¿reemplazará la necesidad de virtualenv? Si no, ¿cómo uso los dos juntos? ¿Instalo virtualenv en Conda o Conda en virtualenv?
  2. ¿Todavía necesito usar pip? Si es así, ¿podré seguir instalando paquetes con pip en un entorno aislado?
Kritz
fuente
Si está interesado en usar conda y pip en Heroku, vea por ejemplo github.com/faph/conda-pip-buildpack
faph
Gracias. Me di cuenta de que hay una gran cantidad de paquetes de construcción de conda para Heroku en github. ¿Qué factores debo tener en cuenta al decidir qué buildpack usar?
Kritz
Tenga en cuenta que aún necesitará usar pip si desea instalar paquetes que no están disponibles directamente desde los servidores de Continuum.
ali_m
Sí, vi que todavía están en Django 1.8 (no 1.9). Por el momento usaré conda donde sea necesario (scipy y numpy) y pip para todo lo demás, pero aún dentro de conda.
Kritz
Creo que la mayoría de los paquetes de construcción de conda Heroku provienen de Kenneth Reitz. Con personas ajustándolas para adaptarlas a sus preferencias. Solo verifique si incluyen soporte para conda y pip si eso es lo que necesita. Y si son compatibles con el archivo environment.yml. Siempre puede consultar rápidamente el código del paquete de compilación para ver si le gusta el script de compilación, por ejemplo, para ver cómo se crean exactamente los entornos.
faph

Respuestas:

157
  1. Conda reemplaza virtualenv. En mi opinión es mejor. No se limita a Python, sino que también se puede usar para otros idiomas. En mi experiencia, proporciona una experiencia mucho más fluida, especialmente para paquetes científicos. La primera vez que instalé MayaVi correctamente en Mac fue con conda.

  2. Aún puedes usar pip. De hecho, se condainstala pipen cada nuevo entorno. Conoce los paquetes instalados por pip.

Por ejemplo:

conda list

enumera todos los paquetes instalados en su entorno actual. Los paquetes instalados por Conda se muestran así:

sphinx_rtd_theme          0.1.7                    py35_0    defaults

y los instalados a través de piptienen el <pip>marcador:

wxpython-common           3.0.0.0                   <pip>
Mike Müller
fuente
8
¿Hay algo negativo en usar pip en un entorno de Anaconda? ¿Hay algún caso en el que desee utilizar pip a pesar de que un paquete estaba disponible a través de Conda?
Clifgray
¿La diferencia es guión vs guión bajo? ¿Qué pasa si el nombre del paquete no tiene ninguno? ¿Cómo diferenciar entonces?
Tom Hale
1
El guión bajo o guión es parte del nombre del paquete. Esto no tiene nada que ver con pip o conda. Los <pip>espectáculos que se instala con la pipa de lo contrario, se instala con Conda.
Mike Müller el
44
Hay una gran advertencia con "conda sabe acerca de los paquetes instalados por pip". Según tengo entendido, dentro de un entorno de conda, pip actúa de forma independiente, por lo que conda no puede desinstalar los paquetes instalados de pip, por ejemplo
information_interchange
1
@clifgray: los paquetes pip y conda que tienen bibliotecas compartidas nativas pueden instalar versiones incompatibles binarias de las que comenzarán a causar todo tipo de fallas en el mundo nativo (sigsegv-s, etc.) difíciles de depurar para alguien que no esté al día con un depurador en C. Lo mismo para los paquetes solo para python, solo que son fáciles de entender.
bobah
34

Entornos virtuales y pip

Agregaré que crear y eliminar entornos de conda es simple con Anaconda.

> conda create --name <envname> python=<version> <optional dependencies>

> conda remove --name <envname> --all 

En un entorno activado , instale paquetes a través de condao pip:

(envname)> conda install <package>

(envname)> pip install <package>

Estos entornos están fuertemente vinculados a la administración de paquetes tipo pip de conda , por lo que es simple crear entornos e instalar paquetes Python y no Python.


Jupyter

Además, la instalaciónipykernel en un entorno agrega una nueva lista en el menú desplegable Kernels de las notebooks Jupyter, extendiendo los entornos reproducibles a las notebooks. A partir de Anaconda 4.1, se agregaron nbextensions , agregando extensiones a las notebooks con mayor facilidad.

Fiabilidad

En mi experiencia, conda es más rápido y más confiable al instalar bibliotecas grandes como numpyy pandas. Además, si desea transferir su estado preservado de un entorno, puede hacerlo compartiendo o clonando un entorno.

pylang
fuente
18

Instalar Conda le permitirá crear y eliminar entornos de Python como desee, por lo tanto, le proporcionará la misma funcionalidad que virtualenv .

En el caso de ambas distribuciones, podría crear un árbol de sistema de archivos aislado, donde puede instalar y eliminar paquetes de Python (probablemente, con pip) como desee. Lo que puede ser útil si desea tener diferentes versiones de la misma biblioteca para diferentes casos de uso o simplemente desea probar alguna distribución y eliminarla luego para conservar su espacio en disco.

Diferencias:

Acuerdo de licencia. Si bien virtualenv se encuentra bajo la licencia MIT más liberal , Conda usa una licencia BSD de 3 cláusulas.

Conda le proporciona su propio sistema de control de paquetes. Este sistema de control de paquetes a menudo proporciona versiones precompiladas (para la mayoría de los sistemas populares) de software popular que no es Python, lo que puede facilitar el funcionamiento de algunos paquetes de aprendizaje automático. Es decir, no tiene que compilar código C / C ++ optimizado para su sistema. Si bien es un gran alivio para la mayoría de nosotros, podría afectar el rendimiento de dichas bibliotecas.

A diferencia de virtualenv, Conda duplica algunas bibliotecas del sistema al menos en el sistema Linux. Estas bibliotecas pueden desincronizarse y provocar un comportamiento inconsistente de sus programas.

Veredicto:

Conda es excelente y debería ser tu opción predeterminada al comenzar tu camino con el aprendizaje automático. Le ahorrará algo de tiempo jugando con gcc y numerosos paquetes. Sin embargo, Conda no reemplaza virtualenv. Introduce una complejidad adicional que no siempre es deseable. Viene bajo licencia diferente. Es posible que desee evitar el uso de conda en entornos distribuidos o en hardware HPC.

y.selivonchyk
fuente
2
¿Le importaría explicar un poco más por qué "podría querer evitar usar conda en entornos distribuidos o en hardware HPC"? @ y.selivonchyk
Oliver Hu
1
No estoy de acuerdo con algunas de estas conclusiones. El "comportamiento inconsistente del programa" es el resultado de no configurar adecuadamente sus programas para usar el condasoftware y las bibliotecas instalados. Y en HPC, condaes preferible en muchos casos, de hecho está siendo utilizado por los administradores de HPC para reemplazar cosas como los modulesistemas. Permite el software instalado por el usuario y un mayor aislamiento del software, dos grandes problemas en HPC. La única advertencia que tengo es que muchos sistemas de archivos HPC tienen límites estrictos en la cantidad de archivos en un directorio, y conda crea muchos miles de archivos.
user5359531
9

Utilizo ambos y (a partir de enero de 2020) tienen algunas diferencias superficiales que se prestan a diferentes usos para mí. Por defecto, Conda prefiere administrar una lista de entornos para usted en una ubicación central, mientras que virtualenv crea una carpeta en el directorio actual. El primero (centralizado) tiene sentido si, por ejemplo, está haciendo aprendizaje automático y solo tiene un par de entornos amplios que utiliza en muchos proyectos y desea acceder a ellos desde cualquier lugar. El último (por carpeta de proyecto) tiene sentido si está haciendo pequeños proyectos únicos que tienen conjuntos de requisitos de lib completamente diferentes que realmente pertenecen más al proyecto en sí.

El entorno vacío que crea Conda es de aproximadamente 122 MB, mientras que el de virtualenv es de aproximadamente 12 MB, por lo que es otra razón por la que puede preferir no dispersar los entornos de Conda en todas partes.

Finalmente, otra indicación superficial de que Conda prefiere sus envs centralizados es que (de nuevo, por defecto) si crea un env de Conda en su propia carpeta de proyecto y lo activa, el prefijo de nombre que aparece en su shell es el absoluto (demasiado largo) ruta a la carpeta. Puede solucionarlo dándole un nombre, pero virtualenv hace lo correcto de manera predeterminada.

Espero que esta información se vuelva obsoleta rápidamente ya que los dos administradores de paquetes compiten por el dominio, pero estas son las compensaciones a partir de hoy :)

Pat Niemeyer
fuente
¡Buena explicación! ¿Tienes dificultades para usar ambos? ¿Alguna vez has usado pipenv?
Mikhail_Sam
8

Otra nueva opción y mi método preferido actual para poner en marcha un entorno es Pipenv

Actualmente es la herramienta de empaquetado Python recomendada oficialmente de Python.org

Kritz
fuente
1
Esto provocó "¿eh? ¿Qué hay de pipenv?", Lo que me llevó a reddit.com/r/Python/comments/8jd6aq/… y sedimental.org/the_packaging_gradient.html . Todavía no sé qué usar, pero al menos estoy mejor informado. Yo creo que.
Matt Wilkie
Después de ver la introducción y leer rápidamente la introducción, pipenv parece no poder administrar las versiones de Python ...
Carles Alcolea
Pipenv @CarlesAlcolea puede especificar las diferentes versiones así por: pipenv --twoa python2 y pipenv --Tres para python3
Kurian Benoy
3

Sí, condaes mucho más fácil de instalar que virtualenv, y prácticamente reemplaza a este último.

Liang Huang
fuente
66
¿Por qué Anaconda proporciona instrucciones para instalar un entorno virtual si los reemplaza?
jmh
1
@jmh Anaconda no reemplaza los entornos virtuales, reemplaza la herramienta de administración del entorno virtual específica de Python virtualenvcon una herramienta de administración del entorno virtual más general conda. Además, Anaconda es solo una distribución de Python + que incluye la herramienta Conda; La pregunta (y la respuesta) son solo sobre Conda.
merv
3
Esta respuesta no agrega nada más allá de las respuestas que llegaron años antes.
merv
1

Trabajo en corporativo, detrás de varios cortafuegos con máquina en la que no tengo acceso de administrador

En mi experiencia limitada con python (2 años), me he encontrado con pocas bibliotecas (JayDeBeApi, sasl) que al instalar a través de pip arrojaron un error de errores de dependencia de C ++: se requiere Microsoft Visual C ++ 14.0. Consíguelo con "Herramientas de compilación de Microsoft Visual C ++": http://landinghub.visualstudio.com/visual-cpp-build-tools

estos se instalaron bien con conda, por lo tanto, desde aquellos días comencé a trabajar con conda env. sin embargo, no es fácil evitar que conda instale dependencias dentro de c.programfiles donde no tengo acceso de escritura.

rohit arora
fuente