Pembekuan pip vs. daftar pip

111

Perbandingan keluaran menunjukkan perbedaan:

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

Dokumentasi Pip menyatakan

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

tapi apa itu "format persyaratan", dan mengapa pip listmenghasilkan daftar yang lebih komprehensif pip freeze?

nitrit
sumber
5
FYI, ini dokumentasinya .
alecxe

Jawaban:

109

Saat Anda menggunakan virtualenv, Anda dapat menentukan arequirements.txt file untuk menginstal semua dependensi.

Penggunaan tipikal:

$ pip install -r requirements.txt

Paket-paket tersebut harus dalam format tertentu agar pipdapat dipahami, yaitu

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

Itu adalah "format persyaratan".

Di sini, django==1.4.2tersirat djangoversi instal 1.4.2(meskipun yang terbaru adalah 1.6.x). Jika Anda tidak menentukan ==1.4.2, versi terbaru yang tersedia akan diinstal.

Anda dapat membaca lebih lanjut di " Virtualenv and pip Basics ", dan dokumentasi resmi " Requirements File Format ".

karthikr
sumber
5
Mengerti. Adakah alasan khusus mengapa "daftar" menghasilkan daftar yang lebih komprehensif daripada "dibekukan"?
nitrl
2
saya pikir itu karena pip listdaftar semuanya, dan pip freezemenginstal semua yang diinstal oleh pip.
karthikr
Hm, itu teori, tapi saya cukup yakin tidak pip install wsgiref.
nitrl
Python 3.2 termasuk wsgiref.egg-infodalam direktori Lib, itulah sebabnya pip tahu tentang itu. Anda tidak dapat [membatalkan] menginstalnya dengan pip, dan versi Python yang lebih baru menghilangkan file metadata sehingga tidak akan muncul.
Zooba
1
@leonid jika Anda menghilangkan nomor versi di akhir, itu akan menginstal versi terbaru dari pypi. Bacalah jawabannya dengan lengkap
karthikr
42

Untuk menjawab bagian kedua dari pertanyaan ini, dua paket ditampilkan di pip listtetapi tidak pip freezeyang setuptools(yang easy_install) dan pipdirinya sendiri.

Sepertinya pip freezetidak mencantumkan paket yang bergantung pada pip itu sendiri. Anda dapat menggunakan --allbendera untuk menunjukkan juga paket-paket itu.

Dari dokumentasi :

--all

Jangan lewati paket-paket ini di output: pip, setuptools, distribut, wheel

ForeverWintr
sumber
3
pip freezememiliki opsi --alluntuk ditampilkan juga: pip, setuptools, distribute, wheel pip.pypa.io/en/stable/reference/pip_freeze
Chananel P
kurang didistribusikan
Max Kleiner
37

Perbedaan utamanya adalah hasil dari pip freeze dapat dibuang ke file Requirement.txt dan digunakan nanti untuk membangun kembali lingkungan "beku".

Dengan kata lain Anda dapat menjalankan: pip freeze > frozen-requirements.txtpada satu mesin dan kemudian pada mesin yang berbeda atau pada lingkungan yang bersih yang dapat Anda lakukan: pip install -r frozen-requirements.txt dan Anda akan mendapatkan lingkungan yang identik dengan dependensi yang sama persis terpasang seperti yang Anda miliki di lingkungan asli tempat Anda menghasilkan frozen-requirement.txt.

Daniel Lahyani
sumber
26

Lihat dokumentasi pip , yang menjelaskan fungsionalitas keduanya sebagai:

daftar pip

Buat daftar paket yang diinstal, termasuk yang dapat diedit.

pip freeze

Keluarkan paket yang diinstal dalam format persyaratan.

Jadi ada dua perbedaan:

  1. Format keluaran, freezememberi kita format persyaratan standar yang dapat digunakan nanti dengan pip install -runtuk menginstal persyaratan.

  2. Output konten, pip listtermasuk editable yang pip freezetidak.

Serjik
sumber
apa yang kami maksud dengan dapat diedit?
Tn. Suryaa Jha
6

pip listmenunjukkan SEMUA paket yang diinstal.

pip freezemenunjukkan paket yang ANDA instal melalui pip(ataupipenv jika menggunakan alat itu) perintah dalam format persyaratan.

Catatan di bawah bahwa setuptools , pip , wheel diinstal saat pipenv shellmembuat amplop virtual saya. Paket-paket ini TIDAK diinstal oleh saya menggunakan 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>

Sekarang tinjau & bandingkan output dari masing-masing perintah di mana saya hanya menginstal cool-lib dan sampleproject (di mana merica adalah ketergantungan):

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
sumber
daftar pip - menunjukkan paket yang diinstal, bukan SEMUA. Cek dokumentasi resmi dan jawaban dari Daniel Lahyani.
filler36
1
@ filler36: Saya pikir "terinstal" tersirat, namun tetap memasukkan umpan balik Anda untuk memastikan ambiguitas tidak menimbulkan potensi kebingungan. Terima kasih atas tanggapan Anda, sangat berterima kasih! - T
F1Linux