O Conda substitui a necessidade de virtualenv?

205

Descobri recentemente o Conda depois de ter problemas para instalar o SciPy, especificamente em um aplicativo Heroku que estou desenvolvendo.

Com o Conda, você cria ambientes muito parecidos com o que o virtualenv faz. Minhas perguntas são:

  1. Se eu usar o Conda, ele substituirá a necessidade de virtualenv? Caso contrário, como uso os dois juntos? Eu instalo o virtualenv no Conda ou o Conda no virtualenv?
  2. Ainda preciso usar o pip? Em caso afirmativo, ainda poderei instalar pacotes com pip em um ambiente isolado?
Kritz
fonte
Se você estiver interessado em usar conda e pip no Heroku, consulte, por exemplo, github.com/faph/conda-pip-buildpack
faph
Obrigado. Percebi que existem vários pacotes de compilação conda para o Heroku no github. Quais fatores devo levar em consideração ao decidir qual buildpack usar?
Kritz
Observe que você ainda precisará usar o pip se quiser instalar pacotes que não estão disponíveis diretamente nos servidores do Continuum.
ali_m
Sim, eu vi que eles ainda estão no Django 1.8 (não 1.9). No momento, usarei o conda onde for necessário (cifrado e entorpecido) e pip para todo o resto - mas ainda dentro do conda.
Kritz 23/12/15
A maioria dos buildpacks Heroku condados são originários do de Kenneth Reitz, eu acho. Com pessoas ajustando-os para se adequarem às suas preferências. Basta verificar se eles incluem o suporte cond e pip, se é isso que você precisa. E se eles suportarem o arquivo environment.yml. Você sempre pode procurar rapidamente pelo código do buildpack para ver se gosta do script de construção, por exemplo, para ver exatamente como os ambientes são criados.
Faph 23/12/2015

Respostas:

157
  1. Conda substitui o virtualenv. Na minha opinião, é melhor. Não é limitado ao Python, mas também pode ser usado para outros idiomas. Na minha experiência, fornece uma experiência muito mais suave, especialmente para pacotes científicos. A primeira vez que instalei o MayaVi corretamente no Mac foi com conda.

  2. Você ainda pode usar pip. De fato, é condainstalado pipem cada novo ambiente. Ele conhece os pacotes instalados pelo pip.

Por exemplo:

conda list

lista todos os pacotes instalados no seu ambiente atual. Pacotes instalados pela Conda aparecem assim:

sphinx_rtd_theme          0.1.7                    py35_0    defaults

e os instalados via piptêm o <pip>marcador:

wxpython-common           3.0.0.0                   <pip>
Mike Müller
fonte
8
Existe algum aspecto negativo no uso de pip em um ambiente Anaconda? Existe um caso em que você gostaria de usar o pip, mesmo que um pacote estivesse disponível através da Conda?
Clifgray 12/05/19
A diferença é hífen vs sublinhado? E se o nome do pacote não tiver? Como diferenciar então?
Tom Hale
1
O sublinhado ou hífen faz parte do nome do pacote. Isso não tem nada a ver com pip ou conda. As <pip>mostras que foi instalado com pip caso contrário é instalado com Conda.
Mike Müller
4
Há uma grande ressalva em "conda sabe sobre pacotes instalados pelo pip". No meu entendimento, dentro de um env Conda, pip age de forma independente, de modo Conda não pode pip desinstalar os pacotes instalados, por exemplo
information_interchange
1
@clifgray - pacotes pip e conda com bibliotecas compartilhadas nativas podem instalar versões binárias incompatíveis daquelas que começarão a causar todos os tipos de falhas no mundo nativo (sigsegv-s, etc.) difíceis de depurar para alguém que não esteja atualizado com um depurador C. O mesmo para pacotes somente em python, apenas que são fáceis de entender.
bobah
61

Resposta curta é, você só precisa de conda.

  1. O Conda combina efetivamente a funcionalidade do pip e do virtualenv em um único pacote, para que você não precise do virtualenv se estiver usando o conda.

  2. Você ficaria surpreso com quantos pacotes o conda suporta. Se não for suficiente, você pode usar pip sob conda.

Aqui está um link para a página conda comparando conda, pip e virtualenv:

https://docs.conda.io/projects/conda/en/latest/commands.html#conda-vs-pip-vs-virtualenv-commands .

Físico louco
fonte
34

Ambientes virtuais e pip

Acrescentarei que criar e remover ambientes conda é simples com o Anaconda.

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

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

Em um ambiente ativado , instale pacotes via condaou pip:

(envname)> conda install <package>

(envname)> pip install <package>

Esses ambientes estão fortemente ligados ao gerenciamento de pacotes do tipo conda , portanto é simples criar ambientes e instalar pacotes Python e não Python.


Jupyter

Além disso, a instalaçãoipykernel em um ambiente adiciona uma nova listagem no menu suspenso Kernels dos notebooks Jupyter, estendendo os ambientes reproduzíveis aos notebooks. A partir do Anaconda 4.1, as nbextensions foram adicionadas , adicionando extensões aos notebooks com mais facilidade.

Confiabilidade

Na minha experiência, o conda é mais rápido e mais confiável na instalação de grandes bibliotecas como numpye pandas. Além disso, se você deseja transferir o estado preservado de um ambiente, pode fazê-lo compartilhando ou clonando um ambiente.

pylang
fonte
18

A instalação do Conda permitirá criar e remover ambientes python conforme desejado, fornecendo a mesma funcionalidade que o virtualenv faria.

No caso de ambas as distribuições, você poderá criar uma árvore de sistema de arquivos isolada, onde poderá instalar e remover pacotes python (provavelmente com pip) como desejar. O que pode ser útil se você quiser ter versões diferentes da mesma biblioteca para diferentes casos de uso ou apenas desejar experimentar alguma distribuição e removê-la posteriormente, economizando espaço em disco.

Diferenças:

Contrato de licença. Enquanto o virtualenv vem com a maioria das licenças MIT liberais , a Conda usa a licença BSD de 3 cláusulas.

A Conda fornece seu próprio sistema de controle de pacotes. Esse sistema de controle de pacotes geralmente fornece versões pré-compiladas (para os sistemas mais populares) de softwares não-python populares, o que pode facilitar o funcionamento de alguns pacotes de aprendizado de máquina. Ou seja, você não precisa compilar código C / C ++ otimizado para o seu sistema. Embora seja um grande alívio para a maioria de nós, pode afetar o desempenho dessas bibliotecas.

Ao contrário do virtualenv, o Conda duplica algumas bibliotecas do sistema pelo menos no sistema Linux. Essas bibliotecas podem ficar fora de sincronia, levando a um comportamento inconsistente dos seus programas.

Veredito:

O Conda é excelente e deve ser a sua escolha padrão ao iniciar o seu caminho com o aprendizado de máquina. Você economizará algum tempo mexendo no gcc e em vários pacotes. No entanto, o Conda não substitui o virtualenv. Introduz alguma complexidade adicional que nem sempre é desejada. Ele vem sob licença diferente. Você pode evitar o uso de conda em ambientes distribuídos ou em hardware HPC.

y.selivonchyk
fonte
2
Se importa em elaborar um pouco mais por que "você pode evitar o uso de conda em ambientes distribuídos ou em hardware HPC"? @ y.selivonchyk
Oliver Hu
1
Não concordo com algumas dessas conclusões. O "comportamento inconsistente do programa" é o resultado de não configurar corretamente seus programas para usar o condasoftware e as bibliotecas instalados. E no HPC, condaé preferível em muitos casos, na verdade, está sendo usado pelos administradores do HPC para substituir itens como modulesistemas. Permite software instalado pelo usuário e maior isolamento do software, dois grandes problemas no HPC. A única ressalva que experimento é que muitos sistemas de arquivos HPC têm limites rígidos no número de arquivos em um diretório, e o conda cria muitos milhares de arquivos.
user5359531
9

Uso ambos e (a partir de janeiro de 2020) eles têm algumas diferenças superficiais que se prestam a diferentes usos para mim. Por padrão, a Conda prefere gerenciar uma lista de ambientes para você em um local central, enquanto o virtualenv cria uma pasta no diretório atual. O primeiro (centralizado) faz sentido se você estiver, por exemplo, realizando um aprendizado de máquina e tiver apenas alguns ambientes amplos que você usa em muitos projetos e deseja pular neles de qualquer lugar. O último (por pasta do projeto) faz sentido se você estiver realizando pequenos projetos pontuais com conjuntos de requisitos de bibliotecas completamente diferentes que realmente pertencem mais ao próprio projeto.

O ambiente vazio criado pela Conda é de cerca de 122 MB, enquanto o virtualenv é de cerca de 12MB, então esse é outro motivo pelo qual você pode preferir não espalhar os ambientes da Conda por todos os lugares.

Finalmente, outra indicação superficial de que o Conda prefere seus envs centralizados é que (novamente, por padrão), se você criar um env do Conda em sua própria pasta de projeto e ativá-lo, o prefixo do nome que aparece no shell é o absoluto (longo demais) caminho para a pasta. Você pode corrigir isso dando um nome, mas o virtualenv faz a coisa certa por padrão.

Espero que essas informações se tornem obsoletas rapidamente, à medida que os dois gerenciadores de pacotes disputam o domínio, mas essas são as compensações de hoje :)

Pat Niemeyer
fonte
Boa explicação! Você tem alguma dificuldade em usar os dois? Você já usou pipenv?
Mikhail_Sam 03/06
8

Outra nova opção e meu atual método preferido de colocar um ambiente em funcionamento é o Pipenv

Atualmente, é a ferramenta de empacotamento Python oficialmente recomendada em Python.org

Kritz
fonte
1
Isso levou "eh? O que é pipenv?", O que me levou a reddit.com/r/Python/comments/8jd6aq/… e sedimental.org/the_packaging_gradient.html . Ainda não sei o que usar, mas pelo menos estou melhor informado. Eu acho que.
27618
Depois de assistir a intro e rapidamente ler a introdução, pipenv não parece ser capaz de gerenciar versões do Python ...
Carles Alcolea
@CarlesAlcolea pipenv pode especificar as várias versões bem por: pipenv --twopara python2 e pipenv --three para python3
Kurian Benoy
3

Sim, condaé muito mais fácil de instalar do que virtualenve praticamente substitui o último.

Liang Huang
fonte
6
Por que o Anaconda fornece instruções para instalar um ambiente virtual se ele é substituído?
jmh
1
@jmh O Anaconda não substitui ambientes virtuais, substitui a ferramenta de gerenciamento de ambiente virtual específica do Python por uma ferramenta de gerenciamento de ambiente virtual virtualenvmais geral conda. Além disso, o Anaconda é apenas uma distribuição Python + que inclui a ferramenta Conda; a pergunta (e a resposta) são apenas sobre a Conda.
Merv #
3
Essa resposta não adiciona nada além das respostas que vieram anos antes.
Merv #
1

Trabalho em empresas, atrás de vários firewalls com máquinas nas quais não tenho acesso de administrador

Na minha experiência limitada com python (2 anos), me deparei com algumas bibliotecas (JayDeBeApi, sasl) que, ao instalar via pip, lançavam erro de erros de dependência de C ++: Microsoft Visual C ++ 14.0 é necessário. Obtenha com "Ferramentas de compilação do Microsoft Visual C ++": http://landinghub.visualstudio.com/visual-cpp-build-tools

estes instalados bem com conda, portanto, desde aqueles dias eu comecei a trabalhar com conda env. no entanto, não é fácil impedir que o conda instale dependência dentro de c.programfiles onde eu não tenho acesso de gravação.

rohit arora
fonte