Zamrożenie pipsów a lista pip

112

Porównanie wyników ujawnia różnice:

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

Dokumentacja Pipa stwierdza

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

ale czym jest „format wymagań” i dlaczego pip listgenerowana jest bardziej wyczerpująca lista niż pip freeze?

nitrl
źródło
5
FYI, oto dokumenty .
alecxe

Odpowiedzi:

110

W przypadku korzystania z pliku virtualenvmożna określić requirements.txtplik, aby zainstalować wszystkie zależności.

Typowe zastosowanie:

$ pip install -r requirements.txt

Pakiety muszą mieć określony format, aby można pipbyło je zrozumieć, czyli

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

To jest „format wymagań”.

Tutaj django==1.4.2implikuje djangowersję instalacyjną 1.4.2(mimo że najnowsza to 1.6.x). Jeśli nie określisz ==1.4.2, zostanie zainstalowana najnowsza dostępna wersja.

Więcej informacji można znaleźć w „ Podstawach Virtualenv i pip ” oraz w oficjalnej dokumentacji „ Format pliku wymagań ”.

karthikr
źródło
5
Rozumiem. Czy istnieje jakiś szczególny powód, dla którego „lista” tworzy bardziej wyczerpującą listę niż „zamrożenie”?
nitrl
2
Myślę, że dzieje się tak, ponieważ pip listwymienia wszystko i pip freezeinstaluje wszystko, co jest zainstalowane przez pip.
karthikr
Hm, to jest teoria, ale jestem prawie pewien, że nie pip install wsgiref.
nitrl
Python 3.2 wsgiref.egg-infodołącza do katalogu Lib, dlatego pip wie o tym. Nie można [od] zainstalować go za pomocą pip, a późniejsze wersje Pythona pomijają plik metadanych, więc się nie pojawi.
Zooba
1
@leonid, jeśli na końcu pozbędziesz się numeru wersji, zainstaluje najnowszą wersję z pypi. Przeczytaj odpowiedź całkowicie
karthikr
42

Odpowiadając na drugą część tego pytania, dwa pakiety pokazane w, pip listale nie pip freezesetuptools(czyli easy_install) i pipsobą.

Wygląda na to, że pip freezepo prostu nie wyświetla pakietów, od których zależy sam pip. Możesz użyć --allflagi, aby wyświetlić również te pakiety.

Z dokumentacji :

--all

Nie pomijaj tych pakietów w danych wyjściowych: pip, setuptools, distribute, wheel

ForeverWintr
źródło
3
pip freezema opcję --allpokazania również: pip, setuptools, distribute, wheel pip.pypa.io/en/stable/reference/pip_freeze
Chananel P
mniej rozpowszechniaj
Max Kleiner
38

Główną różnicą jest to, że dane wyjściowe programu pip freezemożna zrzucić do pliku Requirements.txt i wykorzystać później do ponownego skonstruowania „zamrożonego” środowiska.

Innymi słowy, możesz uruchomić: pip freeze > frozen-requirements.txtna jednej maszynie, a później na innej maszynie lub w czystym środowisku, które możesz wykonać: pip install -r frozen-requirements.txt a otrzymasz identyczne środowisko z dokładnie tymi samymi zależnościami zainstalowanymi, jak w oryginalnym środowisku, w którym wygenerował zamrożone wymagania.txt.

Daniel Lahyani
źródło
26

Spójrz na dokumentację pip , która opisuje funkcjonalność obu jako:

lista pip

Wyświetl listę zainstalowanych pakietów, w tym edytowalnych.

pip zamrozić

Wyprowadź zainstalowane pakiety w formacie wymagań.

Więc są dwie różnice:

  1. Format wyjściowy, freezepodaje nam standardowy format wymagań, który może być później użyty pip install -rdo zainstalowania wymagań z.

  2. Zawartość wyjściowa, pip listobejmuje elementy do edycji, które jej pip freezenie zawierają.

Serjik
źródło
6

pip listpokazuje WSZYSTKIE zainstalowane pakiety.

pip freezepokazy pakiety TY zainstalowane przez pip(lub pipenvw przypadku korzystania z tego narzędzia) polecenie w formacie wymagań.

Uwaga poniżej, że setuptools , pip , wheel są instalowane podczas pipenv shelltworzenia mojej wirtualnej koperty. Te pakiety NIE zostały zainstalowane przeze mnie przy użyciu 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>

Teraz przejrzyj i porównaj dane wyjściowe odpowiednich poleceń, w których zainstalowałem tylko cool-lib i sampleproject (których zależnością jest ziarno pieprzu ):

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
źródło
lista pip - pokazuje zainstalowane pakiety, a nie WSZYSTKIE. Sprawdź oficjalną dokumentację i odpowiedź od Daniela Lahyaniego.
filler36
1
@ filler36: Wydawało mi się, że sugerowano „zainstalowany”, ale mimo to uwzględniłem twoją opinię, aby upewnić się, że niejednoznaczność nie spowodowała potencjalnego zamieszania. Dziękuję za opinię, bardzo dziękuję! - T
F1Linux