Saya memiliki file persyaratan pip yang berubah selama pengembangan.
Dapatkah pip
dibuat untuk menghapus paket yang tidak muncul di file persyaratan serta menginstal yang muncul? Apakah ada metode standar?
Ini akan memungkinkan file persyaratan pip menjadi daftar paket kanonik - pendekatan 'jika dan hanya jika'.
Pembaruan : Saya menyarankannya sebagai fitur baru di https://github.com/pypa/pip/issues/716
Jawaban:
Jawaban singkatnya adalah tidak, Anda tidak dapat melakukannya dengan pip.
sumber
pip uninstall -r requirements.txt
-y
ke @Ommit untuk menghindari menekan Y dan enter berkali-kali. Belajar dari kesalahan saya.pip uninstall -r requirements.txt
hanya akan menghapus versi di Requirement.txt Anda. Jika Anda menghapus instalanboto3==1.10.0
misalnya,pip freeze
akan munculboto3==1.0.1
jika Anda telah menginstalnya (atau versi yang lebih lama) sebelumnya.Ini harus menghapus semua yang tidak ada di dalam Requirement.txt:
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y
Meskipun ini tidak akan berfungsi dengan baik dengan paket yang diinstal dengan
-e
, yaitu dari repositori git atau serupa. Untuk melewati itu, cukup filter paket yang dimulai dengan-e
bendera:pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y
Maka, jelas:
Pembaruan untuk 2016: Anda mungkin tidak benar-benar ingin menggunakan pendekatan di atas. Lihat
pip-tools
danpip-sync
mana yang mencapai apa yang mungkin ingin Anda lakukan dengan cara yang jauh lebih kuat.https://github.com/nvie/pip-tools
Pembaruan untuk Mei 2016:
Anda sekarang juga dapat menggunakan
pip uninstall -r requirements.txt
, namun ini pada dasarnya menghasilkan yang sebaliknya - semua yang ada di dalamnya dicopotrequirements.txt
Pembaruan untuk Mei, 2019:
Lihat pipenv . Banyak hal telah terjadi di dunia manajemen paket yang membuat pertanyaan semacam ini agak usang. Saya sebenarnya masih cukup senang menggunakan pip-tools.
sumber
project.config
file untuk Django pada elastis Pohon Kacang:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
. Sekarang saya dapat mengembalikan paket pip tanpa membangun kembali lingkungan saya hanya dengan menggunakan komentar direquirements.txt
. Ini menghemat waktu henti saya yang sebenarnya. Terima kasih!pip freeze
membuat komentar, tetapi suatu hari mereka dapat menambahkannya ke API, dan jika mereka melakukannya, itu akan valid. Jika tidak, maka di atas adalah no-op. Tanda hubung memungkinkan Anda menggunakan stdin dari perintah sebelumnya, dalam hal ini, tanda hubung memberi tahu grep untuk membandingkan konten persyaratan.txt dengan keluaranpip freeze
(keluaranpip freeze
dalam konteks ini sama dengan stdin)Ini bukan fitur dari
pip
, tidak. Jika Anda benar-benar menginginkan hal seperti itu, Anda dapat menulis skrip untuk membandingkan hasilnyapip freeze
dengan Andarequirements.txt
, tetapi kemungkinan akan lebih merepotkan daripada nilainya.Menggunakan
virtualenv
, lebih mudah dan lebih dapat diandalkan untuk hanya membuat lingkungan yang bersih dan menginstal (ulang)requirements.txt
, seperti:sumber
requirements.txt
), mengapa itu akan diinstal lagi?Sekarang Anda dapat meneruskan
-r requirements.txt
argumen kepip uninstall
.Setidaknya pada
pip
8.1.2,pip help uninstall
menunjukkan:... Uninstall Options: -r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be used multiple times. ...
sumber
Ini adalah pertanyaan lama (tapi bagus), dan banyak hal telah berubah secara substansial sejak ditanyakan.
Ada rujukan begitu saja
pip-sync
di jawaban lain, tetapi layak mendapatkan jawabannya sendiri, karena itu memecahkan masalah OP dengan tepat.pip-sync mengambil
requirements.txt
file sebagai masukan, dan "trues up" lingkungan Python Anda saat ini sehingga cocok persis apa yang ada direquirements.txt
. Ini termasuk menghapus semua paket yang ada di env Anda tetapi tidak ada direquirements.txt
.Contoh: Misalkan kita ingin env kami mengandung (hanya) 3 perpustakaan:
libA
,libB
, danlibC
, seperti:> cat requirements.txt libA==1.0 libB==1.1 libC==1.2
Tetapi env kami saat ini berisi
libC
danlibD
:> pip freeze libC==1.2 libD==1.3
Menjalankan pip-sync akan menghasilkan ini, yang merupakan status akhir yang kami inginkan:
> pip-sync requirements.txt > pip freeze libA==1.0 libB==1.1 libC==1.2
sumber
Proposal Stephen adalah ide yang bagus, tapi sayangnya itu tidak berhasil jika Anda hanya memasukkan persyaratan langsung dalam file Anda, yang terdengar lebih bersih bagi saya.
Semua dependensi akan dicopot, termasuk bahkan
distribute
, mogokpip
sendiri.Mempertahankan file persyaratan bersih saat pelacakan versi lingkungan virtual
Inilah cara saya mencoba melacak versi lingkungan virtual saya. Saya mencoba mempertahankan minimal
requirements.txt
, termasuk hanya persyaratan langsung, dan bahkan tidak menyebutkan batasan versi di mana saya tidak yakin.Tapi selain itu, saya menyimpan, dan menyertakan dalam pelacakan versi (katakanlah git), status sebenarnya dari virtualenv saya dalam sebuah
venv.pip
file.Berikut ini contoh alur kerja:
menyiapkan ruang kerja virtualenv, dengan pelacakan versi:
menginisialisasi sistem pelacakan versi:
git init echo venv > .gitignore pip freeze > venv.pip git add .gitignore venv.pip git commit -m "Python project with venv"
instal paket dengan dependensi, sertakan dalam file persyaratan:
Sekarang mulai buat aplikasi Anda, lalu komit dan mulai cabang baru:
vim myapp.py git commit -am "Simple flask application" git checkout -b "experiments"
instal paket tambahan:
... mainkan, lalu kembali ke versi sebelumnya
vim manage.py git commit -am "Playing with flask-script" git checkout master
Sekarang hapus instalan paket asing:
Saya kira prosesnya dapat diotomatiskan dengan git hooks, tetapi jangan keluar topik.
Tentu saja, masuk akal untuk menggunakan beberapa sistem cache paket atau repositori lokal seperti pip2pi
sumber
Piggybacking off @ stephen-j-fuhry di sini adalah padanan PowerShell yang saya gunakan:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
sumber
Meskipun ini tidak menjawab pertanyaan secara langsung, alternatif yang lebih baik untuk
requirements.txt
saat ini adalah menggunakanPipfile
. Ini berfungsi mirip dengan RubyGemfile
. Saat ini, Anda perlu menggunakanpipenv
alat tersebut tetapi mudah-mudahan alat ini pada akhirnya akan digabungkanpip
. Ini memberikanpipenv clean
perintah yang melakukan apa yang Anda inginkan.(Perhatikan bahwa Anda dapat mengimpor
requirements.txt
denganpipenv install -r requirements.txt
. Setelah ini Anda harus memilikiPipfile
danrequirements.txt
dapat dihapus.)sumber
Sekarang dimungkinkan menggunakan:
sumber