Quais são os equivalentes em Python do empacotador de Ruby / embalagem de Perl?

93

Eu sei sobre virtualenv e pip. Mas eles são um pouco diferentes de empacotador / caixa.

Por exemplo:

  • pip escreve o caminho absoluto para o shebang ou o script de ativação
  • pip não tem o execsubcomando ( bundle exec bar)
  • virtualenv copia o interpretador Python para um diretório local

Todo desenvolvedor Python usa virtualenv / pip? Existem outras ferramentas de gerenciamento de pacotes para Python?

riywo
fonte
4
Não, nem todo usuário Python usa virtualenv. Eu pessoalmente nunca precisei disso.
Fred Foo
Não estou ciente de algo exatamente como Ruby bundler (que eu não sabia até agora, BTW). O que eu costumo fazer é usar virtualenv e pip e setuptools - ou distutils ou qualquer sistema de distribuição que eu encontrar primeiro no Google :) Também estou curioso para saber uma resposta, mas esta é a minha solução na maioria das vezes.
brandizzi
pipenve shovelmencionados abaixo são opções mais modernas, uma vez que esta pergunta foi feita.
Jim Meyer
Nem pipenv nem shovel são equivalentes. Shovel não é nada como bundler, mais como rake. O gerenciamento de dependências do Python está bem atrás. Ele será mesclado com o pip um dia ( pypi.org/project/pipfile ) ...
Nomas Prime

Respostas:

72

Pelo que li sobre o bundler - pip sem virtualenv deve funcionar bem para você. Você pode pensar nisso como algo entre o comando gem regular e o bundler. Coisas comuns que você pode fazer com o pip:

  1. Instalando pacotes (instalação gem)

    pip install mypackage
  2. Dependências e instalação em massa (gemfile)

    Provavelmente, a maneira mais fácil é usar os arquivos requirements.txt do pip. Basicamente, é apenas uma lista simples de pacotes necessários com possíveis restrições de versão. Pode ser algo como:

    nose==1.1.2
    django<1.3
    PIL

    Posteriormente, quando quiser instalar essas dependências, você deve fazer:

    $ pip install -r requirements.txt

    Uma maneira simples de ver todos os seus pacotes atuais na sintaxe do arquivo de requisitos é fazer:

    $ pip freeze

    Você pode ler mais sobre isso aqui .

  3. Execução (bundler exec)

    Todos os pacotes python que vêm com arquivos executáveis ​​geralmente estão disponíveis diretamente após a instalação (a menos que você tenha uma configuração personalizada ou seja um pacote especial). Por exemplo:

    $ pip install gunicorn
    $ gunicorn -h 
  4. Empacote joias para instalação do cache (pacote bundler)

    Existe pip bundlee pip zip/unzip. Mas não tenho certeza se muitas pessoas o usam.

ps Se você se preocupa com o isolamento do ambiente, você também pode usar o virtualenv junto com o pip (eles são amigos próximos e funcionam perfeitamente juntos). Por padrão, o pip instala pacotes em todo o sistema que podem exigir direitos de administrador.

Denys Shabalin
fonte
46
A grande vantagem do bundler é exatamente que a parte virtualenv é integrada e, na maioria dos casos, não são necessários direitos de administrador. Na verdade, o pacote pode muito bem ser a única joia de que se precisa globalmente. bundle install --path vendorinstala tudo localmente e bundle execé inteligente o suficiente para descobrir isso. Não há necessidade de mudanças de ambiente explícitas.
Debilski
11
Não acho que o ponto 3 esteja correto. Simplesmente rodar um executável ruby ​​pode ser feito com ou sem bundle exec. O ponto principal bundle execé que ele altera o ambiente Gemfileantes de executar o executável. Pip não tem equivalente a bundle exec, embora o virtualenv tenha.
Sean Mackesey de
@SeanMackesey sempre que você executa o activate do ambiente virtualenv, você imediatamente se torna dentro do ambiente, por exemplo, python aponta para aquele no env, não instalado globalmente, pythonpath está correto com relação ao env, todos os aplicativos também rodam desse env.
Denys Shabalin
8
A principal coisa sobre bundler é que ele é um padrão de fato agora, você pode praticamente garantir que QUALQUER projeto ruby ​​de virtualmente qualquer tamanho, terá um Gemfilesat em sua raiz, e você pode bundle installe está pronto para ir, ou bundle --deploymente isso ' Vou apenas rodar em um servidor com pouca coisa a fazer, desde que a máquina tenha a versão necessária do Ruby. Python simplesmente não tem equivalente. As ferramentas estão aí, a onipresença cultural não.
ocodo
14

Você pode usar pipenv , que tem interface semelhante com bundler.

$ pip install pipenv

Pipenv cria virtualenv automaticamente e instala dependências de Pipfileou Pipfile.lock.

$ pipenv --three           # Create virtualenv with Python3
$ pipenv install           # Install dependencies from Pipfile
$ pipenv install requests  # Install `requests` and update Pipfile
$ pipenv lock              # Generate `Pipfile.lock`
$ pipenv shell             # Run shell with virtualenv activated

Você pode executar o comando com escopo virtualenv como bundle exec.

$ pipenv run python3 -c "print('hello!')"
nonileno
fonte
3

Existe um clone pbundler .

A versão que está atualmente em pip simplesmente lê o requirements.txtarquivo que você já possui, mas está muito desatualizado. Também não é totalmente equivalente: ele insiste em fazer a virtualenv. O Bundler, eu noto, apenas instala os pacotes que estão faltando, e dá a você a opção de fornecer sua senha sudo para instalar em seus diretórios de sistema ou reiniciar, o que não parece ser um recurso do pbundler.

No entanto, a versão no git é uma reescrita quase completa para ficar muito mais próxima do comportamento do Bundler ... incluindo ter um "Cheesefile" e agora sem suporte para o arquivo requirements.txt. Isso é lamentável, uma vez que requirements.txt é o padrão de fato em pythonland, e há até trabalho oficial com carimbo BDFL para padronizá-lo . Quando isso entrar em vigor, você pode ter certeza de que algo como o pbundler se tornará o padrão de fato. Infelizmente, nada muito estável ainda que eu saiba (mas adoraria ser provado que estou errado).

Kousu
fonte
Este projeto parece ter desaparecido. Considere Poesia: stackoverflow.com/a/61771381/115075
bb.
1

Eu escrevi um - https://github.com/Deepwalker/pundler . No PIP épundle , o nome já foi citado.

Ele usa requirements(_\w+)?.txtarquivos como dependências desejadas e criafrozen(_\w+)?.txt arquivos com versões congeladas.

Sobre a (_\w+)?coisa - isso é envs. Você pode criar requirements_test.txt e depois usarPUNDLEENV=test para usar esses deps em sua execução com os de requirements.txt ao lado.

E sobre virtualenv - você não precisa de um, é o que pundle tira do bundler na primeira cabeça.

Mihail Krivushin
fonte
1

Eu diria que Shovel vale uma olhada. Ele foi desenvolvido especificamente para a versão Pythonish do Rake. Não há uma tonelada de atividades de commit no projeto, mas parece estável e útil.

Jim Meyer
fonte
1

Python Poetry é o mais próximo do bundler Ruby em 2020 (e já desde 2018). Já tem mais de dois anos, ainda está muito ativo, tem ótima documentação. Alguém pode reclamar que o curl-pipe-python-style é a maneira recomendada de instalação, mas existem alternativas, por exemplo, homebrew no macOS.

Ele usa o virtualenvs nos bastidores (em contraste com o bundler), mas fornece e usa um arquivo de bloqueio, cuida das subdependências, adere às restrições de versão especificadas e permite a atualização automática de pacotes desatualizados. Há até mesmo autocompletar para seu shell favorito.

Com o uso de um arquivo pyproject.toml, ele também vai um pouco além do bundler (mais próximo de um gemspec. Também é comparável ao npm e yarn do JavaScript e do TypeScript).

Poetrify (um projeto complementar) ajuda a converter projetos de requirements.txt em pyproject.toml para Poesia.

O arquivo de bloqueio pode ser exportado para requirements.txt por poetry export -f requirements.txt > requirements.txt, se você precisar disso para outras ferramentas (ou no caso improvável de querer voltar).

bb.
fonte
0

Não, todos os desenvolvedores usam virtualenv e / ou pip, mas muitos desenvolvedores usam / preferem essas ferramentas

E agora, para ferramentas de desenvolvimento de pacotes e diferentes ambientes, essa é a sua verdadeira questão. Existem outras ferramentas como Buildout ( http://www.buildout.org/en/latest/ ) para o mesmo propósito, isole o sistema de compilação Python de seu ambiente para cada projeto que você gerencia. Há algum tempo eu uso isso, mas agora não.

Ambientes independentes por projeto, em Python são um pouco diferentes que a mesma situação em Ruby. No meu caso, eu uso pyenv ( https://github.com/yyuu/pyenv ) que é algo como rbenv, mas, para Python. diferentes versões de python e virtualenvs por projeto e, nesses ambientes isolados, posso usar pip ou easy-install (se necessário).

Yonsy Solis
fonte