Qual é a relação entre virtualenv e pyenv?


175

Recentemente, aprendi a usar o virtualenv e o virtualenvwrapper no meu fluxo de trabalho, mas vi o pyenv mencionado em alguns guias, mas não consigo entender o que é pyenv e como é diferente / semelhante ao virtualenv. O pyenv é um substituto melhor / mais recente para o virtualenv ou uma ferramenta complementar? Neste último caso, o que faz de diferente e como os dois (e o virtualenvwrapper, se aplicável) funcionam juntos?


3
fgimian.github.io/blog/2014/04/20/… : No entanto, existe outra alternativa chamada pyenv que possui várias vantagens significativas .
Martijn Pieters

11
Não seja como eu e se pyenvconfunda com #pyvenv
User

Respostas:


162

Pyenv e virtualenv são ferramentas muito diferentes que funcionam de maneiras diferentes para fazer coisas diferentes:

  • O Pyenv é uma extensão do bash - não funciona no Windows - que intercepta suas chamadas para python, pip, etc., para direcioná-las a uma das várias cadeias de ferramentas python do sistema. Portanto, você sempre tem disponíveis todas as bibliotecas que instalou na versão python selecionada - portanto, é bom para usuários que precisam alternar entre versões diferentes do python.

  • O VirtualEnv , é um python puro, portanto funciona em todos os lugares; copia, opcionalmente , uma versão específica de python e pip local para o ambiente de ativação que pode ou não incluir links para a cadeia de ferramentas do sistema atual, caso contrário instale apenas um subconjunto conhecido de bibliotecas nesse ambiente. Como tal, é quase certamente muito melhor para teste e implantação, pois você sabe exatamente quais bibliotecas, em quais versões são usadas e uma mudança global não afetará seu módulo.

venv python> 3.3

Observe que a partir do Python 3.3 em diante, há uma implementação incorporada do VirtualEnv chamada venv (com, em algumas instalações, um wrapper chamado pyvenv - esse wrapper está obsoleto no Python 3.6 ), que provavelmente deve ser usado de preferência. Para evitar possíveis problemas com o wrapper, geralmente é uma boa ideia usá-lo diretamente usando /path/to/python3 -m venv desired/env/pathou você pode usar o excelente pyseletor python no Windows com py -3 -m venv desired/env/path. Ele criará o diretório especificado com desired/env/pathconfigure e o preencherá adequadamente. Em geral, é muito parecido com o uso do VirtualEnv.

Ferramentas Adicionais

Vale a pena mencionar várias ferramentas e considerar, pois elas podem ajudar no uso de um ou mais dos itens acima:

  • VirtualEnvWrapper Gerencie e simplifique o uso e gerenciamento do VirtualEnv - Cross Platform .
  • pyenv-virtualenv , instalado pelo pyenv-installer , que fornece ferramentas PyEnv para gerenciar e fazer interface com o VirtualEnv - com isso você pode ter uma instalação básica que inclui mais de uma versão do python e criar ambientes isolados em cada um deles - Linux / OS- X . Sugerida por Johann Visagie
  • O PyInstaller pode pegar seu código python, possivelmente desenvolvido e testado no VirtualEnv, e agrupá-lo para que ele possa executar uma plataforma que não possui a sua versão do python instalada - Observe que não é um compilador cruzado, você precisará de um Windows (virtual -) máquina para criar instalações do Windows, etc., mas pode ser útil mesmo onde você pode ter certeza de que o python será instalado, mas não pode ter certeza de que a versão do python e todas as bibliotecas serão compatíveis com o seu código.

3
Provavelmente vale a pena mencionar o pyenv-virtualenv, um plugin pyenv que permite que o pyenv e o virtualenv funcionem perfeitamente em uníssono. Se você instalou o pyenv usando o pyenv-installer, o pyenv-virtualenv já estará presente. * github.com/yyuu/pyenv-virtualenv * github.com/yyuu/pyenv-installer
wjv

1
E venvagora, na biblioteca padrão?
Flimm

@Flimm: Do python 3.3 em diante, o venv faz parte da biblioteca padrão e deve ser usado em vez do virtualenv, pois é frequentemente descrito como "virtualenv feito corretamente" - reddit.com/r/learnpython/comments/4hsudz/pyvenv_vs_virtualenv
Steve Barnes

2
pyenv-virtualenv não é (ou pelo menos não é mais) apenas linux. Existe um pacote homebrew para uma instalação fácil no MacOS.
Turn

Obrigado por destacar a interoperabilidade!
HashRocketSyntax

16

virtualenvpermite criar uma instalação personalizada do Python, por exemplo, em um subdiretório do seu projeto. Cada um dos seus projetos pode, portanto, ter o seu próprio python(ou até vários) sob o respectivo virtualenv. É perfeitamente aceitável que alguns / todos os virtualvvs tenham a mesma versão python(por exemplo, 2.7.16) sem conflito - eles vivem separadamente e não se conhecem. Se você deseja usar qualquer um desses pythons, é necessário activate(executando um script que modificará temporariamente o seu PATHpara garantir que o bin/diretório do virtualenv seja o primeiro). A partir desse ponto, chamar python(ou pipetc.) chamará a versão do virtualenv até você deactivate(que restaura a PATH).

pyenvopera em uma escala mais ampla do que virtualenv- mantém um registro das instalações do Python (e pode ser usado para instalar novas) e permite configurar a versão do Python a ser executada ao usar o pythoncomando. Soa semelhante, mas o uso prático é um pouco diferente. Ele funciona anexando seu pythonscript shim ao seu PATH(permanentemente) e depois decidindo qual "real" pythonchamar. Você pode até configurar o pyenv para chamar um dos pythons do virtualenv (usando o pyenv-virtualenvplug - in). As versões Python que você instala usando pyenventram em seu $(pyenv root)/versions/diretório (por padrão, a raiz do pyenv é ~ / .pyenv), portanto, são mais 'globais' que o virtualenv. Normalmente, você não pode duplicar as versões do Python instaladas pyenv, pelo menos não é a idéia principal.

Para criar um virtualenv com uma versão específica do Python, é necessário ter essa versão em algum lugar do sistema (esteja ela ativada PATHou não) e essencialmente cloná-la no seu virtualenv recém-criado. Obviamente, uma maneira de obter uma versão específica é instalá-la via pyenv. Feito isso, os virtualenvs individuais são livres para divergir, tendo diferentes módulos (ou versões dos mesmos) instalados neles.

Em resumo:

  • virtualenv permite criar instalações python locais e independentes, clonando as existentes
  • pyenv permite que você instale versões diferentes do python simultaneamente (em todo o sistema ou apenas para o usuário local) e, em seguida, escolha qual a multidão de pythons a serem executados a qualquer momento (incluindo os criados pelo virtualenv ou Anaconda)
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.