Qual é a diferença entre venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?


1025

O Python 3.3 inclui em sua biblioteca padrão o novo pacote venv. O que faz e como difere de todos os outros pacotes que parecem corresponder ao regex (py)?(v|virtual|pip)?env?


20
E para antecipar as votações apertadas, senti que essa era uma pergunta mais geral do que stackoverflow.com/questions/29950300/… , e não me senti à vontade editando essa pergunta ou postando uma resposta excessivamente geral nessa postagem.
Flimm

12
Este guia é útil e constantemente atualizado, pois o python continua a adicionar mais e mais "uma e apenas uma maneira óbvia" de fazer as coisas: docs.python-guide.org/en/latest/dev/virtualenvs
michael

2
A partir da versão 3.6, achei mais fácil fazer com que o virtualenv funcionasse em comparação com o pyenv no macOS (eu sou um pyNoob)
HashRocketSyntax

@HashRocketSyntax virtualenve pyenvnão executam a mesma função e não são alternativas uma para a outra. Veja minha resposta.
Flimm

7
Eu queimei um dia inteiro perdendo tempo com pipenv. Bottom line, é super-comercializado. Venv e virtualenv, se você precisar de py2, são as ferramentas adequadas. Conda (miniconda, se você não precisa do stack completo) também é muito bom. Muito bom writeup: chriswarrick.com/blog/2018/07/17/...
SwimBikeRun

Respostas:


1383

Pacotes PyPI que não estão na biblioteca padrão:

  • virtualenvé uma ferramenta muito popular que cria ambientes Python isolados para bibliotecas Python. Se você não estiver familiarizado com essa ferramenta, recomendo aprendê-la, pois é uma ferramenta muito útil, e farei comparações com ela pelo restante desta resposta.

    Ele funciona instalando um monte de arquivos em um diretório (por exemplo env/:) e modificando a PATHvariável de ambiente para prefixá-la com um bindiretório personalizado (por exemplo env/bin/:). Uma cópia exata do pythonou python3binário é colocada nesse diretório, mas o Python é programado para procurar bibliotecas relativas ao seu caminho primeiro, no diretório do ambiente. Ele não faz parte da biblioteca padrão do Python, mas é oficialmente abençoado pelo PyPA (Python Packaging Authority). Uma vez ativado, você pode instalar pacotes no ambiente virtual usando pip.

  • pyenvé usado para isolar versões do Python. Por exemplo, você pode testar seu código em Python 2.7, 3.6, 3.7 e 3.8, portanto precisará de uma maneira de alternar entre eles. Uma vez ativado, ele prefixa a PATHvariável de ambiente com ~/.pyenv/shims, onde existem arquivos especiais correspondentes aos comandos do Python ( python, pip). Essas não são cópias dos comandos fornecidos pelo Python; eles são scripts especiais que decidem rapidamente qual versão do Python executar com base na PYENV_VERSIONvariável de ambiente, no .python-versionarquivo ou no ~/.pyenv/versionarquivo. pyenvtambém torna o processo de baixar e instalar várias versões do Python mais fácil, usando o comando pyenv install.

  • pyenv-virtualenvé um plugin criado pyenvpelo mesmo autor que pyenv, para permitir o uso pyenve virtualenvao mesmo tempo convenientemente. No entanto, se você estiver usando o Python 3.3 ou posterior, pyenv-virtualenvtentará executar python -m venvse estiver disponível, em vez de virtualenv. Você pode usar virtualenve em pyenvconjunto sem pyenv-virtualenv, se não quiser os recursos de conveniência.

  • virtualenvwrapperé um conjunto de extensões para virtualenv(consulte a documentação ). Dá-lhe comandos como mkvirtualenv, lssitepackagese, especialmente, workonpara alternar entre diferentes virtualenvdiretórios. Essa ferramenta é especialmente útil se você deseja vários virtualenvdiretórios.

  • pyenv-virtualenvwrapperé um plugin para pyenvpelo mesmo autor como pyenv, para integrar convenientemente virtualenvwrapperem pyenv.

  • pipenvpretende combinar Pipfile, pipe virtualenvem um comando na linha de comando. O virtualenvdiretório normalmente é colocado ~/.local/share/virtualenvs/XXX, XXXsendo um hash do caminho do diretório do projeto. Isso é diferente de virtualenv, onde o diretório normalmente está no diretório de trabalho atual. pipenvdeve ser usado no desenvolvimento de aplicativos Python (ao contrário de bibliotecas). Existem alternativas para pipenv, como poetry, que não listarei aqui, já que esta pergunta é apenas sobre os pacotes com nomes semelhantes.

Biblioteca padrão:

  • pyvenvé um script fornecido com o Python 3, mas reprovado no Python 3.6 , pois apresentava problemas (sem mencionar o nome confuso). No Python 3.6+, o equivalente exato é python3 -m venv.

  • venvé um pacote enviado com o Python 3, que você pode executar usando python3 -m venv(embora por alguma razão algumas distribuições o separem em um pacote de distribuição separado, como python3-venvno Ubuntu / Debian). Ele serve ao mesmo propósito que virtualenv, mas possui apenas um subconjunto de seus recursos ( veja uma comparação aqui ). virtualenvcontinua a ser mais popular do que venv, especialmente porque o primeiro suporta Python 2 e 3.

Recomendação para iniciantes:

Esta é minha recomendação pessoal para iniciantes: comece aprendendo virtualenve pip, ferramentas que funcionam com o Python 2 e 3 e em uma variedade de situações, e escolha outras ferramentas assim que começar a precisar delas.


115
Isso é muito útil! Então, por que existem 8 coisas emaranhadas em vez de 1? ( “Deve haver um - e preferencialmente só um - modo óbvio para fazê-lo.” - The Zen of Python)
Jerry101

60
@ Jerry101, a introdução do venv é em parte uma resposta a essa bagunça. Se você quiser ajudar a melhorar a situação, sugiro que você use o venv e incentive outras pessoas a fazer o mesmo.
Magnus Lind Oxlund

31
"a introdução do venv é em parte uma resposta a essa bagunça" Como é que quando há muitas coisas que fazem 'algo como X', as pessoas sempre pensam que podem melhorar essa bagunça criando outra coisa que faz 'algo como X' . É meio engraçado, na verdade. Agora estamos 4 anos depois ... então pode ser pertinente perguntar, venvrealmente resolveu esse problema?
Kris

34
As únicas duas ferramentas na lista que realmente cobrem o que é sem dúvida o mesmo território são virtualenv e venv, portanto, a caracterização de que estamos lidando com uma bagunça causada por várias ferramentas concorrentes não é muito precisa. A lista, no entanto, consiste em várias ferramentas relacionadas ao ambiente virtual, todas com nomes com sons semelhantes. Isso pode ser confuso, especialmente para usuários que estão apenas aprendendo sobre eles. O venv melhorou a situação? Ele ofereceu uma alternativa mais leve a outras ferramentas de ambiente virtual, beneficiando-se de modificações nativas e um lugar na biblioteca padrão. ...
Magnus Lind Oxlund

11
@cowbert Após apenas atualizar o Python 3.5 para o Python 3.6 e ter todos os meus virtualenvs quebrados, parece que venvvocê pode atualizar para uma nova versão do Python mais facilmente.
Daniel H

277

Gostaria apenas de evitar o uso de virtualenvapós o Python3.3 + e, em vez disso, usar a biblioteca padrão fornecida venv. Para criar um novo ambiente virtual, digite:

$ python3 -m venv <MYVENV>  

virtualenvtenta copiar o binário Python no diretório bin do ambiente virtual. No entanto, ele não atualiza os links dos arquivos da biblioteca incorporados nesse binário, portanto, se você criar o Python da origem em um diretório que não seja do sistema com nomes de caminho relativos, o binário do Python será interrompido. Como é assim que você cria uma cópia Python distribuível, é uma grande falha. Para inspecionar os links dos arquivos da biblioteca incorporada no OS X, use otool. Por exemplo, de dentro do seu ambiente virtual, digite:

$ 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)

Consequentemente, eu evitaria virtualenvwrappere pipenv. pyvenvestá obsoleto. pyenvparece ser usado frequentemente onde virtualenvé usado, mas eu também ficaria longe disso, já que acho que venvtambém faz o que pyenvfoi construído.

venvcria ambientes virtuais no shell que são novos e em área restrita , com bibliotecas instaláveis ​​pelo usuário e é seguro para vários python . Novo porque os ambientes virtuais começam apenas com as bibliotecas padrão fornecidas com python, você precisa instalar outras bibliotecas novamente pip installenquanto o ambiente virtual estiver ativo. Em área restrita porque nenhuma dessas novas instalações de biblioteca é visível fora do ambiente virtual, para que você possa excluir todo o ambiente e começar de novo sem se preocupar com o impacto na instalação básica do python. Bibliotecas instaláveis ​​pelo usuário porque a pasta de destino do ambiente virtual é criada semsudoem algum diretório que você já possui, portanto não precisará de sudopermissões para instalar bibliotecas nele. Por fim, é seguro para vários tipos de python , pois quando os ambientes virtuais são ativados, o shell vê apenas a versão em python (3.4, 3.5 etc.) usada para criar esse ambiente virtual.

pyenvé semelhante ao venvpermitir gerenciar vários ambientes python. No entanto, pyenvvocê não pode reverter convenientemente as instalações da biblioteca para algum estado inicial e provavelmente precisará de adminprivilégios em algum momento para atualizar as bibliotecas. Então eu acho que também é melhor usar venv.

Nos últimos anos, eu encontrei muitos problemas nos sistemas de compilação (pacotes emacs, construtores de aplicativos autônomos python, instaladores ...) que acabam por resolver problemas virtualenv. Eu acho que o python será uma plataforma melhor quando eliminarmos essa opção adicional e usarmos apenas venv.


3
add2virtualenvajusta o seu PYTHONPATHadicionando um _virtualenv_path_extensions.ptharquivo personalizado em site-packages. Como alternativa, você pode atualizar a PYTHONPATHvariável de ambiente no bin/activatearquivo que chama sempre que ativar o ambiente virtual. Ou você pode adicionar links simbólicos abaixo site-packagespara apontar para os diretórios extras. Ambas as alternativas são mais transparentes às ferramentas tradicionais de linha de comando que os desenvolvedores usam amplamente para solucionar problemas. O uso de um costume .pthcom um nome não documentado faz com que pareça IMO mais mágico.
Riaz Rizvi

15
Ok, confirmei no stackoverflow.com/questions/48130371/… que uma atualização correta PYTHONPATHevita a necessidade add2virtualenv. Com relação à falta de ajuda no SO desde o seu primeiro comentário, minha única sugestão é que as respostas sejam positivas se eles resolverem o seu problema, para motivar as pessoas a solucionar problemas quando você postar? Meia hora de investigação + redação em troca de um clique do mouse? Soa como um bom comércio ...
Riaz Rizvi

7
Não, você está certo - eu tento ser bom em votar. Caramba, se você estivesse na minha área, eu compraria uma cerveja para você. Vou cumprir minha promessa e ver se o pessoal do documento python me permitirá adicionar a alteração em / bin / ativar os documentos oficiais para maior clareza. Embora eu não seja ótimo, não sou péssimo em python. Se foi difícil para mim ... De qualquer forma, obrigado pelo seu tempo - desejo o melhor.
SteveJ

9
@ MalikA.Rumi, a bênção foi ligeiramente reduzida para "o criador do Pipenv diligentemente comercializado para nós e para outros, e é por isso que mencionamos o Pipenv".
Rob Grant

6
@AndreaMoro É pyvenvque está obsoleto, não pyenv. É tão fácil ficar confuso com os nomes dessas ferramentas.
Daniel Holmes

25

pipenvDesci na toca do coelho ( é realmente um buraco escuro e profundo ... ) e, como a última resposta foi há mais de 2 anos , achei útil atualizar a discussão com os desenvolvimentos mais recentes sobre o tópico de envelopes virtuais do Python I encontrei.

AVISO LEGAL:

Essa resposta NÃO é sobre continuar o debate acirrado sobre os méritos de pipenv versus venv como soluções-envelope - também não endosso . É sobre PyPA aprovação de normas conflitantes e como o desenvolvimento futuro da VIRTUALENV promessas para negar fazer um ou / ou escolha entre eles em tudo. Eu me concentrei nessas duas ferramentas justamente porque elas são as ungidas pelo PyPA .

venv

Como observa o OP, o venv é uma ferramenta para ambientes de virtualização. NÃO é uma solução de terceiros, mas uma ferramenta nativa. O PyPA endossa o venv pela criação de VIRTUAL ENVELOPES : " Alterado na versão 3.5: O uso do venv agora é recomendado para a criação de ambientes virtuais ".

pipenv

O pipenv - como o venv - pode ser usado para criar envelopes virtuais, mas também oferece funcionalidade degerenciamento de pacotes e verificação de vulnerabilidades . Em vez de usarrequirements.txt,pipenvfornece gerenciamento de pacotes via Pipfile . À medida que o PyPA apóia o pipenv para GESTÃO DE PACOTES , isso parece implicarpipfileem suplantarrequirements.txt.

NO ENTANTO : o pipenv usa o virtualenv como sua ferramenta para criar envelopes virtuais, NÃO o venv, que é endossado pelo PyPA como a ferramenta principal para a criação de envelopes virtuais.

Padrões conflitantes:

Portanto, se a escolha de uma solução de envelope virtual não fosse suficientemente difícil, agora temos o PyPA endossando duas ferramentas diferentes que usam soluções diferentes de envelope virtual. O debate intenso do Github sobre venv vs virtualenv, que destaca esse conflito, pode ser encontrado aqui .

Resolução de Conflitos:

O debate no Github mencionado no link acima orientou o desenvolvimento do virtualenv na direção de acomodar o venv em versões futuras :

prefira o venv embutido: se o python de destino tiver venv, criaremos o ambiente usando isso (e depois executaremos operações subsequentes para facilitar outras garantias que oferecemos)

Conclusão:

Portanto, parece que haverá alguma convergência futura entre as duas soluções rivais de envelope virtual, mas a partir de agora o pipenv - que usa virtualenv- varia materialmente venv.

Dados os problemas resolvidos pela pipenv e o fato de o PyPA ter dado sua bênção, ele parece ter um futuro brilhante. E se o virtualenv cumpre seus objetivos de desenvolvimento propostos, a escolha de uma solução de envelope virtual não deve mais ser um caso de pipenv OU venv .


6
Pelo que entendi: o valor real do pipenv já está em debate há um tempo e não é lançado há mais de um ano. Muitas coisas mudaram desde então, e eu diria que isso só piorou para o pipenv (ferramentas como poesia e pip-tools estão em muito melhor forma). As páginas do PyPA estão desatualizadas e eu argumentaria que elas deveriam rebaixar a pipenv . O venv é uma ferramenta padrão e, como tal, é muito eficiente, mas possui um conjunto limitado de recursos. O virtualenv não compete com o venv, mas tenta cobrir as áreas em que o venv não pode ou não deseja ir (já que é um padrão).
sinoroc 28/01

@sinoroc meu post não foi sobre os méritos ou pipenv., Era sobre a orientação conflitantes de PyPA endossando tanto pipenv E venv fazer a escolha de uma solução envelope mais difícil e como ele aparece algum grau de convergem negará a necessidade de escolher entre eles. Observe que eu não apoio nada, apenas compartilhei o que aprendi sobre como essas duas soluções endossadas pelo PyPA estão evoluindo. Dado o interesse do PyPA neles, gostar ou não deles se torna irrelevante: é provável que pipenv e venv se tornem parte da paisagem
F1Linux

9
Eu diria que atenha-se ao venv e ao pip o máximo possível. Estes dois estão aqui para ficar, venv faz parte da biblioteca padrão do Python e em um sentido pip bem já que é vendorizadas em Python (via ensurepip ). As outras ferramentas ( séries pyenv à parte: algo totalmente diferente) parecem depender ou emular (com mais ou menos sucesso) venv e pip . O que é ótimo. Mas se as coisas derem errado , venv e pip são o substituto seguro. A única outra ferramenta que eu uso é o tox (com tox-venv) para ajudar a criar e preencher os ambientes virtuais (direto, sem mágica, estranho, ainda não foi mencionado).
sinoroc 28/01

3
Este último post é de ouro, pois fez um ótimo trabalho em eliminar as rugas. Estou aderindo ao pip e ao venv, pois tive problemas com binários pendentes usando o virtualenv quando o python do sistema foi atualizado.
codeviper

1
no passado, eu tive problemas com o pipenv nonverbose por erros. argl e vala. Também: chriswarrick.com/blog/2018/07/17/…
qrtLs

4

Atualização de abril de 2020

Eu estava procurando o mesmo quando me deparei com este post . Eu acho que essa questão de qual ferramenta usar é bastante confusa e difícil para novos usuários de Python como eu. Isso é diretamente do site do PyPA sobre o pipenv:

Embora este tutorial cubra o projeto pipenv como uma ferramenta que se concentra principalmente nas necessidades de desenvolvimento de aplicativos Python, e não no desenvolvimento de bibliotecas Python, o próprio projeto está atualmente trabalhando em vários problemas de processo e manutenção que impedem a publicação de correções de erros e novos recursos ( com a totalidade de 2019 passando sem uma nova versão). Isso significa que, no curto prazo, o pipenv ainda sofre de várias peculiaridades e problemas de desempenho sem um cronograma claro para a resolução desses problemas.

Embora esse continue sendo o caso, é provável que os mantenedores do projeto desejem investigar Outras Ferramentas para Gerenciamento de Dependência de Aplicativos para uso em vez de ou em conjunto com o pipenv.

Supondo que a liberação do pipenv de abril de 2020 prossiga conforme o planejado, e a liberação depois disso também permaneça no caminho, essa advertência no tutorial será removida. Se essas versões não permanecerem no caminho certo, o tutorial em si será removido e substituído por uma página de discussão nas opções de gerenciamento de dependências disponíveis.


Parece que o pipenv está atualmente (ou seja, em maio de 2020) ainda em pré-lançamento para o lançamento de abril de 2020. Veja aqui .
andrewjames

Isso não responde à pergunta.
Flimm

Acho que @Flimm respondeu bem às perguntas. Eu estava respondendo à resposta do
F1Linux

1
Em 4 de junho de 2020, a pipenvequipe lançou duas versões para o PyPI: 2020.5.28e, mais recentemente,2020.6.2 : pypi.org/project/pipenv/#history
não sendo em
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.