Virtualenv: [RFC] A próxima geração do virtualenv

Criado em 10 jun. 2019  ·  37Comentários  ·  Fonte: pypa/virtualenv

Após a discussão em 1362 , tornou-se aparente que, para que o virtualenv seja capaz de oferecer suporte ao novo mundo (instalações da Windows Store, intérpretes do venv), precisamos de uma grande mudança de direção.

Aqui está minha proposta para prosseguir com este projeto. Este será um grande refator para o projeto, que planeja manter a compatibilidade da interface existente.

Objetivo do projeto

  • criar uma nova cópia do sistema (invocador) python que tem sua própria lista de pacotes controláveis ​​separadamente ,
  • uma interface e comportamento que sejam, tanto quanto possível, consistentes em todos os ambientes Python com suporte (por exemplo, backport de novos recursos venv para interpretadores mais antigos),
  • extensível (suporte de script de criação e ativação de shell),
  • Pacote PyPi (capacidade de atualização fora da banda com intérprete).

Recursos planejados

  • roda pypi universal ,
  • plataforma cruzada - Windows, todos os tipos de UNIX, MacOS.
  • suporte para a maioria dos pythons suportados , o pool inicial de versões Python suportadas: python2.7 , python3.4 , python3.5 , python3.5 , pypy3 , pypy2 (esperando por IronPython e Jython em algum momento - algum outro que devamos oferecer suporte?)
  • Um período de dois anos : nossa interface manterá o suporte do intérprete por mais dois anos após seu EOL: a criação de ambientes virtuais é tão básica que este pacote é o último que deve perder compatibilidade. Durante este período de transição de dois anos, garantimos a correção de bugs e compatibilidade. No entanto, o suporte a novos recursos é o melhor esforço.
  • capacidade de especificar o python alvo (usaremos PEP-514 / PEP-394 / link explícito para descobrir essas versões) e criar ambientes virtuais, mesmo se esse destino não tiver este pacote instalado
  • prefira venv integrado : se o python de destino tiver venv, criaremos o ambiente usando isso (e, em seguida, realizaremos as operações subsequentes para facilitar outras garantias que oferecemos)
  • capacidade de provisionar pacotes seed (após a criação dos ambientes virtuais, esses pacotes já estarão instalados):

    • aceitamos o formato PEP-508,
    • capacidade de entrar em contato com o PyPi para obter as especificações mais recentes correspondentes ou apenas offline (esses pacotes de instalação devem ser offline)
    • por padrão pip , setuptools e wheel são os pacotes de sementes (esses pacotes também são injetados automaticamente como pacotes de roda offline)
  • interfaces :

    • Interface CLI ( python -m virtualenv , virtualenv )
    • interface da roda (env PYTHONPATH=/t/path/to/virtualenv.whl python -m virtualenv ) - roda universal,
    • interface zipapp,
    • Interface da API: import virtualenv; virtualenv.create("target")
  • suporte a shell - scripts de ativação / desativação e variáveis ​​de ambiente de prompt - por padrão, geramos:

    • bash / zsh,
    • csh,
    • peixe,
    • PowerShell,
    • xonsh,
    • cmd,
    • Pitão,
    • uma API bem definida para instalar scripts de shell personalizados (talvez como parte do sistema de plug-ins).
  • sistema de configuração de três camadas , cada opção é determinada da seguinte forma:

    • primeiro, suporte de configuração ini (uma configuração ini global presente na casa do usuário),
    • segundo, variáveis ​​de ambiente com o prefixo VIRTUALENV_ ,
    • finalmente, opções de linha de comando (com base em argparse)
  • sistema de plug-ins - são pontos de extensão em que o usuário pode injetar sua própria lógica personalizada e gerar uma versão estendida do virtualenv (lógica de inicialização atual):

    • estender o analisador (adicionar seus próprios sinalizadores CLI personalizados),
    • ajustar opções (alterar opções após análise CLI),
    • após a instalação (execute alguma operação assim que a criação do ambiente virtual for concluída)
  • suporte virtualenv - a operação deve funcionar mesmo se o python invocador for um python criado pelo virtualenv,
  • suporte a venv - a operação deve funcionar mesmo se o python invocador for um python criado pelo virtualenv,
  • ambientes relocáveis : um ambiente deve continuar funcionando enquanto o python raiz não for removido do sistema operacional (por exemplo, renomear a pasta do ambiente raiz não deve interromper as coisas).

Diferença de stdlib venv

Em que diferimos da biblioteca padrão venv? O pacote virtualenv planeja ser:

  • um pacote PyPi, como tal, será atualizado com mais frequência, mais fácil de se manter atualizado e oferecer paridade de recursos entre pythons,
  • descoberta de intérprete integrada e suporte para intérpretes cruzados,
  • mais interfaces (zippapp, wheel, pacote instalado),
  • personalização mais fácil - sistema de plugins,
  • ser o campo de testes para novos recursos (que, no futuro, podem chegar ao venv),
  • EOL mais longo.

Em geral, oferece recursos que outras ferramentas downstream (por exemplo, tox, pre-commit, pipenv, pipsi, pipx) que precisam de ambientes virtuais como uma API desejaria.

Os membros do PyPy (e o público também) compartilham suas idéias ou mais um, se você concordar. @pfmoore @dstufft @di @pradyunsg @cjerdonek @ncoghlan @jaraco @techalchemy @uranusjr @pganssle @ benoit-pierre @dholth @lkollar @takluyver @zooba

Comentários muito úteis

Então, a reescrita chegou a um estado em que me sinto confortável com as pessoas dando uma olhada e dando alguns comentários. Entre em contato comigo se tiver algum tempo livre para ajudar com isso; o plano é que seja lançado até o final do mês 🤞 Observação https://github.com/pypa/virtualenv/milestone/7 ainda precisa ser implementado, no entanto, a ideia central está lá.

PS. Criou um PR de feedback em https://github.com/pypa/virtualenv/pull/1481/

Todos 37 comentários

Uma proposta ambiciosa!

suporte de configuração ini (uma configuração ini global presente na casa do usuário)

Considere o uso de appdirs (ou semelhante) para descobrir a configuração em locais preferenciais da plataforma.

appdirs também pode ser uma opção, embora então precisaríamos iniciar o negócio de vender coisas em nosso pacote. Para ser justo 70% disso já está feito, só precisaria de uma reorganização melhor.

Por que vender em vez de depender apenas dele? (Não que seja difícil de vender, é apenas um único arquivo). IMO, realmente precisamos aceitar que (com a notável exceção do pip) ferramentas de empacotamento realmente devem ser construídas como qualquer outro aplicativo. Se ter dependências é suficientemente difícil para que os aplicativos PyPA as evitem, o que isso diz sobre o quão bem estamos facilitando o desenvolvimento de aplicativos para nossos usuários?

(Desculpe, não estou falando muito sobre o virtualenv aqui, só vejo tantas pessoas dizendo "adicionar uma dependência de PyPI não é grande coisa", então as ferramentas PyPA com as quais trabalho em vendas me fazem pensar ...) .

Sem vender, o recurso de intérprete cruzado será difícil, eu acho. Por exemplo, criar um ambiente virtual para um intérprete sem o virtualenv instalado.

PYTHONPATH = / t / path / to / virtualenv.whl python -m virtualenv

Uh, isso significa que não podemos depender de nenhum pacote adicional do virtualenv. Como forneceremos um zipapp, quais casos de uso isso permite?

@gaborbernat Você quer dizer a opção -p ? Eu acho. Parece exatamente o tipo de situação para a qual os zipapps pretendiam ajudar, mas ninguém jamais fez muito para descobrir os detalhes de como fazê-lo funcionar bem.

De @pradyunsg :

Uh, isso significa que não podemos depender de nenhum pacote adicional do virtualenv

Na verdade, como @gaborbernat disse, a opção -p provavelmente implica que :-( Mas eu me pergunto por que precisamos da opção "roda PYTHONPATH " e também do zipapp - especialmente considerando que rodas em PYTHONPATH não são suportados em geral (nós os usamos internamente no virtualenv por causa dos motivos usuais de inicialização do pip - o pip é praticamente uma exceção para tudo ;-))

período de

Hum...

Minha preocupação aqui é que os efeitos de rede disso podem causar lentidão na adoção de versões mais recentes do Python e a explosão combinacional do número de Pythons suportados. CPython está discutindo diferentes cadências de lançamento para 3.9, então 2 anos pode até ser mais longo do que alguns lançamentos podem ter de devs centrais.

Dito isso, não quero bloquear isso, mas principalmente garantir que expresse que não estou interessado em fazer isso.

(esperando por IronPython e Jython em algum ponto - qualquer outro que devamos oferecer suporte?)

Com certeza. @gaborbernat provavelmente sabe que eu diria isso - seria bom tê-los, mas tenho certeza de que as pessoas mais familiarizadas com a implementação estariam melhor posicionadas para fazer isso. No mínimo, em termos de suporte a longo prazo e, idealmente, também o trabalho de obter um bom suporte em primeiro lugar (IC, testes, etc).

primeiro, suporte de configuração ini (uma configuração ini global presente na casa do usuário),

Eu sou tendencioso - eu realmente gostaria que este fosse o TOML. :)

(Eu não processei isso completamente ainda, uma vez que tenho que ir a algum lugar - mas isso parece um grande objetivo geral!)

nós já não podemos realmente depender de pacotes adicionais por causa do recurso de interpretador cruzado, então eu não considero isso como uma grande desvantagem, e eu gostaria de ter uma maneira simples sem instalação / dependência de rodar ambientes virtuais (necessário quando as pessoas nos invocar a partir de pacotes de nós). Dado que não nos custa muito, a oferta além do zipapp parece barata.

prefira venv integrado: se o python de destino tiver venv, criaremos o ambiente usando isso (e, em seguida, realizaremos as operações subsequentes para facilitar outras garantias que oferecemos)

Não tenho certeza se entendi a razão disso. Parece que isso tornará a manutenção de virtualenv mais difícil e tornará os comportamentos mais difíceis de serem compreendidos pelos usuários finais. setuptools já está indo para o outro lado ao tentar absorver distutils vez de continuar a fazer o monkey patch.

@pganssle o escopo é diferente e o espaço do problema também. virtualenv é que freqüentemente os sistemas colocam restrições adicionais nos pacotes do sistema, então eles fazem o patch do venv embutido para aderir a elas. Seria difícil replicar tudo isso, consulte, por exemplo, # 1362.

FWIW Eu acho que usar o pacote venv para isolamento é a ideia certa, ele está embutido no interpretador real (ao invés de distutils que é apenas um módulo stdlib) para que possa fazer coisas muito mais limpas do que virtualenv pode.

O Virtualenv também não precisaria fazer o monkeypatch de nada, ele apenas usaria a API pública, o que deveria funcionar.

FWIW, eu recomendaria verificar meu antigo branch de reescrever virtualenv, ele já fazia muitas dessas coisas.

Eu provavelmente sugeriria que um sistema de plug-in não é muito útil para o virtualenv, no máximo, é provável que haja apenas um gancho, uma etapa de pós-criação e, mesmo assim, você provavelmente pode escapar apenas tendo uma lista de coisas para instalar.

TAMBÉM, você ainda pode depender de coisas "naturalmente" e ainda usar zipapps, você só precisa vender dentro do próprio zipapp. Eu recomendaria sair da opção reexecutar sob o alvo python, é uma coisa ruim e pode ser feita de forma muito mais limpa.

697 - PR mais antigo de @dstufft

PYTHONPATH = / t / path / to / virtualenv.whl python -m virtualenv

OTOH, provavelmente não deveríamos fazer isso de qualquer maneira - https://www.python.org/dev/peps/pep-0427/#is -it-possible-to-import-python-code-direct-from- arquivo de roda

@pradyunsg então algum outro método para bootstrapping pip sem colocar a roda no caminho?

O pip de inicialização provavelmente está OK - é o que o virtualenv usa agora 1 . Mas eu recomendo fortemente usá-lo apenas para pip, e não como um meio de executar o virtualenv em si.

1 Mas eu evitaria qualquer funcionalidade complicada - usar uma roda no PATH para instalar o pip dessa roda é quase certo que está OK. Mas você pode ter problemas se, por exemplo, acessar a Internet usando essa roda, pois acho que o certifi precisa de seu pacote de certificado incorporado como um arquivo real (mas posso estar errado, isso nunca me causou um problema, mas eu sei get-pip.py extrai os certificados da roda explicitamente para tratar desse ponto.

Há alguma razão pela qual não enviamos pip como zipapp ? Isso evitaria essa necessidade, pelo que entendi, e zipapp é compatível com python 2.7 🤔

@gaborbernat você já experimentou? funciona? se a abordagem que você descreveu funciona no Windows, não tenho nenhuma preocupação inicial, mas provavelmente @uranusjr teria feedback. Meus únicos comentários estão de acordo com @dstuff, o que quer dizer - mais simples é melhor

Alguma razão para não enviarmos pip como zipapp?

Porque em certos casos, o pip não roda direto de um arquivo zip (ou de uma roda, é a mesma coisa), como falei acima. 99% (alerta - número composto) das vezes, funciona, mas às vezes o fato de que o pacote do certificado precisa ser um arquivo real é importante.

Provavelmente funcionaria bem agrupar o pip como um shiv , já que o shiv descompacta o zipapp antes de executá-lo, precisamente para evitar os casos extremos em que correr de um zip break. Ninguém, que eu saiba, tentou, no entanto.

Como de costume, os principais motivos pelos quais isso não aconteceu são:

  1. Ninguém pensou nisso.
  2. Ninguém teve tempo / motivação para o fazer.
  3. A abordagem atual funciona bem, e há peixes maiores para fritar.

então, quaisquer outros métodos para bootstrapping pip sem colocar a roda no caminho?

Não acho que precisamos disso aqui - virtualenv está usando o pip wheel para instalar o IIRC por si mesmo, que deve funcionar bem. Como @pfmoore disse, a única coisa "extra" que get-pip.py faz é descompactar os certificados e fornecer um caminho para eles. Visto que o caso de uso do virtualenv não chegará à rede, não precisamos fazer nada de novo aqui.

A abordagem atual funciona bem, e há peixes maiores para fritar.

Isso, muito mais do que os outros IMO. Poderíamos, mas há questões mais impactantes para resolver. :)

Eu tive um PR em um ponto que construiu o pip como um aplicativo zip, ele funcionou, mas IIRC eu tive que fazer mudanças no pip para torná-lo totalmente funcional.

Isso pode ser um pouco complicado agora, já que o pip invoca a si mesmo como um subprocesso de si mesmo para o PEP 517. Não tenho certeza, mas definitivamente vale a pena explorar isso.

Neste ponto, o shiv (ou outra opção de extração automática) seria mais adequado para o pip do que tentar trabalhar o pip em um zip executável. Mas não acho que isso seja particularmente importante neste ponto. o assegurepip já segue a rota da roda no caminho, por que não fazer o mesmo. O bootstrapping alternativo de pip pode ser explorado depois de fritarmos todos os peixes maiores e, potencialmente, ser contribuído de volta para o stdlib.

O bootstrapping alternativo de pip pode ser explorado depois de fritarmos todos os peixes maiores

Parece um plano que já estamos seguindo. ;)]

Obrigado pelos links, com base no feedback, comecei alguns trabalhos iniciais em https://github.com/gaborbernat/virtualenv/tree/rewrite/src/virtualenv. O plano é colocá-lo em uma forma de lançamento no próximo mês (e ter uma semana de revisão aberta antes disso). Com base no impacto da mudança, planejo fazer com que ele libere 20.0.0 .

1 para usar venv se existir. Isso tornaria o caso de uso do PyPy mais simples.

Então, a reescrita chegou a um estado em que me sinto confortável com as pessoas dando uma olhada e dando alguns comentários. Entre em contato comigo se tiver algum tempo livre para ajudar com isso; o plano é que seja lançado até o final do mês 🤞 Observação https://github.com/pypa/virtualenv/milestone/7 ainda precisa ser implementado, no entanto, a ideia central está lá.

PS. Criou um PR de feedback em https://github.com/pypa/virtualenv/pull/1481/

Solicitação de recurso: forneça um mecanismo para definir variáveis ​​de ambiente personalizadas, por exemplo, colocando um arquivo env.txt no diretório venv bin com o formato padrão:

VARNAME=value
OTHERVAR=othervalue

Acho que não entendo seu caso de uso. Como essas variáveis ​​de ambiente seriam usadas, definidas e quando?

Editar. NM. Vejo você expandido em https://github.com/pypa/virtualenv/issues/1124.

Uma pequena atualização; Consegui fechar a maioria dos problemas de bloqueio, além de dois que ainda precisam de algum cuidado: o teste inclui cabeçalhos + cache de chamadas de interrogação python com algum bloqueio aplicado sobre os dados do aplicativo, para que possamos criar ambientes virtuais em paralelo (para locais diferentes). No ritmo atual, posso chegar alguns dias atrasado ... mas definitivamente devo sair em 7 de fevereiro.

Qual é o nosso plano em termos de implementação? Teríamos um beta lançado antes do lançamento principal?

Sim, quero lançar algo na segunda-feira ... E então deixar provisoriamente uma semana para feedback, correções ... E então substituir master por reescrever e liberar.

Não estou 100% certo de que uma semana seria o suficiente e, com certeza, devemos comunicar através de vários canais que queremos que as pessoas experimentem o beta.

A palavra-chave lá estava provisoriamente . Estou otimista aqui, dado o esforço que fiz, não estou esperando grandes problemas, mas 🤷‍♂

Como a versão beta foi lançada, acho que esse problema atendeu ao objetivo. Vou encerrar e podemos discutir mais focados em questões específicas.

Esta página foi útil?
0 / 5 - 0 avaliações