Como o Pipfile e o Pipfile.lock são usados?

131

Parece que o Pipfile / Pipfile.lock pretende substituir o requirements.txt, no contexto do empacotamento do Python. Entretanto, não há muita documentação sobre como eles realmente funcionam. Encontrei uma descrição em evolução do pipfile na seção PyPi do site Python aqui, mas é bastante confusa e não explica a semântica das diferentes seções do arquivo.

Alguma dica sobre como entender esses arquivos?

Stephen
fonte
2
Este é um análogo direto do Gemfilee Gemfile.lockdo mundo Ruby: O .lockarquivo possui versões específicas para cada dependência; aquele sem essa extensão tem apenas as versões conhecidas por controlar seres humanos. Dito isto, pedir uma explicação de algo que ainda está evoluindo e muito longe de ser bem definido, muito menos padronizado, talvez seja um pouco prematuro.
Charles Duffy
(E da mesma forma, a diferença entre Pipfilee requirements.txté em grande parte o fato de o primeiro tentar adotar recursos do mundo Ruby, ou seja, poder especificar conjuntos de dependências para vários ambientes e com condições / opções / etc dentro de um único arquivo).
Charles Duffy
1
Parece que ele já foi implantado no repo "iniciando o Python" do Heroku ( github.com/heroku/python-getting-started.git ), de modo que goste ou não, parece que está sendo produzido.
Stephen
Peguei vocês. Dito isto - os documentos parecem sólidos para mim. Não sei o que poderia escrever em uma resposta que não seria apenas reafirma-los.
Charles Duffy
1
Se você está se referindo ao link que eu criei no OP, há várias coisas omitidas, por exemplo, o que realmente significa que algo esteja em uma seção chamada origem.
Stephen

Respostas:

165

O conceito por trás desses arquivos é simples e análogo a outras ferramentas já existentes, se você tiver alguma familiaridade com o Ruby Bundler ou o Npm do Node. Pipenvé uma ferramenta de gerenciamento de pacotes e de ambiente virtual que usa os arquivos Pipfile e Pipfile.lock para atingir esses objetivos.

O Pipenv lida com o ambiente virtual para você de uma maneira padrão padrão (não é mais necessário ativar e desativar). Abaixo, alguns princípios básicos para você começar, veja mais no site pipenv .

Começando

Comece a usar o pipenv é fácil, no tipo de pasta do seu projeto ...

$ pipenv install

... e se já tiver um requirements.txtarquivo, ele gerará um Pipfilearquivo com os requisitos e uma pasta do ambiente virtual; caso contrário, ele gerará um Pipfilearquivo vazio . Se você não gostou ou mudou de idéia sobre algo que instalou, basta digitar ...

$ pipenv uninstall <package>

... e você está pronto para ir. Para ativar o ambiente virtual que o pipenv já gerou, vá com ...

$ pipenv shell

... e seu ambiente virtual será ativado. Para deixar o meio ambiente ...

$ exit

... e você voltará à sua sessão original do terminal.

Pipfile

O arquivo Pipfile destina-se a especificar os requisitos de pacotes para seu aplicativo ou biblioteca Python, tanto para desenvolvimento quanto para execução. Você pode instalar um pacote usando simplesmente ...

$ pipenv install flask

... e será adicionado como uma dependência para implantação e execução ou usando ...

$ pipenv install --dev pytest

... e será usado como uma dependência para o tempo de desenvolvimento. A sintaxe do arquivo é bastante simples, como segue.

[[source]] # Here goes your package sources (where you are downloading your packages from).
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages] # Here goes your package requirements for running the application and its versions (which packages you will use when running the application).
requests = "*"
flask = "*"
pandas = "*"

[dev-packages] # Here goes your package requirements for developing the application and its versions (which packaes you will use when developing the application)
pylint = "*"
wheel = "*"

[requires] # Here goes your required Python version.
python_version = "3.6"

Pipfile.lock

O Pipfile.lock pretende especificar, com base nos pacotes presentes no Pipfile , qual versão específica deles deve ser usada, evitando os riscos de atualizar automaticamente pacotes que dependem um do outro e quebrar a árvore de dependência do projeto.

Você pode bloquear seus pacotes atualmente instalados usando ...

$ pipenv lock

... e a ferramenta pesquisará sua pasta do ambiente virtual para gerar o arquivo de bloqueio automaticamente, com base nas versões atualmente instaladas. A sintaxe do arquivo não é tão óbvia quanto no Pipfile ; portanto, por uma questão de concisão, ela não será exibida aqui.

danieldeveloper001
fonte
Essa é uma resposta interessante, mas acho que, quando estava perguntando, não conseguia entender direito o que realmente significa [[source]], como é a fonte dos pacotes baixados pelo pipenv ou algo mais? Eu acho que o restante dos dois arquivos é óbvio o suficiente.
Stephen
1
Eu admito, achei confuso porque estou trabalhando em um tutorial em que tenho que decidir se a diferença entre [package] / [dev-package] é importante ou se devo colocar tudo em [package]. (Pesquisando sobre isso foi o que me levou a esta página.) Mas ter os dois ao colocar coisas de dev no [pacote] meio que me impressionou. Eu pude ver porque as solicitações deveriam estar no [pacote].
Al Sweigart
1
Alterado, conforme solicitado, para evitar confusão nos pacotes de desenvolvimento, obrigado pelo seu comentário, espero que seja menos confuso agora :) #
danieldeveloper001
1
Eu acho que é uma boa idéia, se você quiser acompanhar as versões de um pacote ao longo da evolução do código-fonte, já que a maioria dos pacotes será estrelada por uma versão Pipfile. Se algo ocorrer em uma atualização de pacote, é possível corrigi-lo revisando o histórico da versão do pacote e, de fato, um dos criadores da biblioteca de solicitações recomenda fazê-lo aqui .
precisa
1
@Stephen, na verdade é o oposto, como indicado na pipenv instalar a documentação você pode especificar o --skip-lockflag para forçá-lo a ignorar o Pipfile.lockarquivo em vez de forçá-lo a usá-lo;)
danieldeveloper001