Pip freeze vs. lista de pip

111

Uma comparação de resultados revela diferenças:

user@user-VirtualBox:~$ pip list
feedparser (5.1.3)
pip (1.4.1)
setuptools (1.1.5)
wsgiref (0.1.2)
user@user-VirtualBox:~$ pip freeze
feedparser==5.1.3
wsgiref==0.1.2

Estados de documentação de Pip

freeze                      Output installed packages in requirements format.
list                        List installed packages.

mas o que é "formato de requisitos" e por que pip listgera uma lista mais abrangente do que pip freeze?

nitrl
fonte
5
Para sua informação, aqui estão os documentos .
alecxe

Respostas:

109

Ao usar um virtualenv, você pode especificar um requirements.txtarquivo para instalar todas as dependências.

Um uso típico:

$ pip install -r requirements.txt

Os pacotes precisam estar em um formato específico para pipentender, que é

feedparser==5.1.3
wsgiref==0.1.2
django==1.4.2
...

Esse é o "formato de requisitos".

Aqui, django==1.4.2implica a djangoversão de instalação 1.4.2(embora a mais recente seja 1.6.x). Se você não especificar ==1.4.2, a versão mais recente disponível será instalada.

Você pode ler mais em " Noções básicas de Virtualenv e pip " e na documentação oficial do " Formato de arquivo de requisitos ".

Karthikr
fonte
5
Entendi. Existe alguma razão particular pela qual "list" produz uma lista mais abrangente do que "congelar"?
nitrl
2
acho que é porque pip listlista tudo e pip freezeinstala tudo instalado pelo pip.
karthikr
Hm, isso é uma teoria, mas tenho quase certeza que não pip install wsgiref.
nitrl
O Python 3.2 inclui wsgiref.egg-infono diretório Lib, e é por isso que pip sabe sobre isso. Você não pode [des] instalá-lo com o pip, e versões posteriores do Python omitem o arquivo de metadados para que ele não apareça.
Zooba
1
@leonid se você se livrar do número da versão no final, ele instalará a versão mais recente do pypi. Leia a resposta na íntegra
karthikr
42

Para responder à segunda parte desta questão, os dois pacotes mostrados em pip listmas não pip freezesão setuptools(que é easy_install) e pipele mesmo.

Parece que pip freezesimplesmente não lista os pacotes dos quais o pip depende. Você pode usar a --allbandeira para mostrar também esses pacotes.

Da documentação :

--all

Não pule esses pacotes na saída: pip, setuptools, distribua, wheel

ForeverWintr
fonte
3
pip freezetem a opção --allde mostrar também: pip, setuptools, distribute, wheel pip.pypa.io/en/stable/reference/pip_freeze
Chananel P
menos distribuição
Max Kleiner
37

A principal diferença é que a saída de pip freezepode ser despejada em um arquivo requirements.txt e usada posteriormente para reconstruir o ambiente "congelado".

Em outras palavras, você pode executar: pip freeze > frozen-requirements.txtem uma máquina e depois em uma máquina diferente ou em um ambiente limpo, você pode fazer: pip install -r frozen-requirements.txt e você obterá um ambiente idêntico com as mesmas dependências instaladas exatamente como tinha no ambiente original onde você gerou o arquivo frozen-requirements.txt.

Daniel Lahyani
fonte
26

Veja a documentação do pip , que descreve a funcionalidade de:

lista de pip

Lista os pacotes instalados, incluindo editáveis.

pip freeze

Pacotes instalados de saída no formato de requisitos.

Portanto, existem duas diferenças:

  1. O formato de saída freezenos fornece o formato de requisito padrão que pode ser usado posteriormente pip install -rpara instalar os requisitos.

  2. Conteúdo de saída, pip listinclui editáveis ​​que pip freezenão.

Serjik
fonte
o que queremos dizer com editáveis?
Sr. Suryaa Jha
6

pip listmostra TODOS os pacotes instalados.

pip freezemostra os pacotes que VOCÊ instalou através do comando pip(ou pipenvse estiver usando essa ferramenta) em um formato de requisitos.

Observe abaixo que as ferramentas de configuração , pip , roda são instaladas ao pipenv shellcriar meu envelope virtual. Esses pacotes NÃO foram instalados por mim usando pip:

test1 % pipenv shell
Creating a virtualenv for this project
Pipfile: /Users/terrence/Development/Python/Projects/test1/Pipfile
Using /usr/local/Cellar/pipenv/2018.11.26_3/libexec/bin/python3.8 (3.8.1) to create virtualenv
 Creating virtual environment...
<SNIP>
Installing setuptools, pip, wheel...
done.
 Successfully created virtual environment! 
<SNIP>

Agora analise e compare a saída dos respectivos comandos onde instalei apenas cool-lib e sampleproject (dos quais pimenta é uma dependência):

test1 % pip freeze       <== Packages I'VE installed w/ pip

-e git+https://github.com/gdamjan/hello-world-python-package.git@10<snip>71#egg=cool_lib
peppercorn==0.6
sampleproject==1.3.1


test1 % pip list         <== All packages, incl. ones I've NOT installed w/ pip

Package       Version Location                                                                    
------------- ------- --------------------------------------------------------------------------
cool-lib      0.1  /Users/terrence/.local/share/virtualenvs/test1-y2Zgz1D2/src/cool-lib           <== Installed w/ `pip` command
peppercorn    0.6       <== Dependency of "sampleproject"
pip           20.0.2  
sampleproject 1.3.1     <== Installed w/ `pip` command
setuptools    45.1.0  
wheel         0.34.2
F1Linux
fonte
lista pip - mostra os pacotes instalados, não TODOS. Verifique a documentação oficial e a resposta de Daniel Lahyani.
filler36
1
@ filler36: Achei que "instalado" estava implícito, mas mesmo assim incorporei seu feedback para garantir que a ambiguidade não criasse uma confusão potencial. Obrigado pelo seu feedback, muito obrigado! - T
F1Linux