Apakah menghapus paket dengan "pip" juga menghapus paket yang tergantung?
153
Ketika Anda menggunakan pipuntuk menginstal paket, semua paket yang diperlukan juga akan diinstal dengannya (dependensi). Apakah mencopot paket itu juga menghapus paket yang tergantung?
Mengapa Anda tidak bisa mencobanya dan melihatnya saja? Saya akan melakukan hal itu untuk menjawab pertanyaan Anda, tetapi karena alasan tertentu pip tidak bisa mendapatkan indeks paket di sini sekarang.
Thomas Vander Stichele
1
Saya telah menemukan di newsgroup pip bahwa orang pip tidak menginginkan fungsi ini, setidaknya untuk saat ini. Kasihan sekali!
Michel Samia
4
@ThomasVanderStichele karena jawaban itu tidak akan tersedia online untuk Googlers masa depan :)
Mark
1
@Arkah itu akan, Anda hanya menuliskan jawaban untuk pertanyaan Anda sendiri di sini.
Thomas Vander Stichele
5
@ThomasVanderStichele: Saya bukan OP, tapi inilah mengapa ini adalah T&J yang sangat sah untuk SO: pipadalah a) sangat rapuh dan bergantung pada versi, juga b) dalam beberapa pemasangan pelanggan yang harus saya kerjakan, dipasang dengan hak administrator (walaupun paket tidak), maka menghancurkan atau menghapus instalan itu adalah kesedihan yang luar biasa dan Anda memiliki satu kesempatan untuk melakukannya dengan benar. c) konektivitas internet mungkin tidak bagus; untuk alasan keamanan, mesin perusahaan sering kali diblokir, jadi Anda tidak dapat menggunakan konektivitas langsung, dan Anda harus tahu sebelumnya semua yang Anda perlukan dan versinya, dan mengunduhnya.
smci
Jawaban:
81
Tidak, itu tidak menghapus paket dependensi. Itu hanya menghapus paket yang ditentukan:
$ pip install specloud
$ pip freeze # all the packages here are dependencies of specloud package
Bekerja dengan baik untuk saya di Python 3 pada Oktober 2019.
camilan
@ loved.by.Jesus - Saya menggunakan python 3.8.3 dan saya menguji dan masih melihat perintah dieksekusi sebagai pip-autoremove(dash bukan garis bawah). pip_autoremovememberi saya command not found.
bwv549
@ bwv549 Saya harus menjelaskan bahwa saya mengeksekusi melalui python<version>(ketika versi harus ditentukan). Dengan cara itu, kita perlu menyesuaikan namanya pip_autoremove(tanda hubung tidak diizinkan sebagai nama paket). Misalnya python3.8 pip_autoremoveberfungsi tetapi python3.8 pip-autoremovetidak. Kalau tidak, seperti yang Anda tunjukkan, sebagai perintah terminal sederhana pip-autoremove, ia berfungsi dengan sempurna :) —meski hanya versi python standar dari sistem yang digunakan. Terima kasih atas pesan Anda.
loved.by.Yesus
9
saya telah berhasil menghapus dependensi suatu paket menggunakan garis bash ini:
for dep in $(pip show somepackage | grep Requires| sed 's/Requires: //g; s/,//g');do pip uninstall -y $dep ; done
Meskipun secara teknis solusi ini berhasil menghapus semua dependensi, seperti yang disebutkan dalam jawaban lain, itu juga menghapus instalan dependensi yang tidak unik untuk target , termasuk yang diinstal dari paket sistem. Sebagai contoh, pada sistem saya, skrip ini akhirnya gagal karena paket target memiliki ketergantungan yang sama dengan pip, jadi pip mencopot ketergantungannya sendiri sebelum skrip selesai, dan kemudian gagal.
sinisterstuf
19
Waspadalah ini hanya menghapus dependensi level bawah berikutnya, tetapi bukan dependensi dependensi tersebut.
tamakisquare
0
Saya telah menemukan solusinya walaupun mungkin agak sulit untuk dilakukan.
Langkah 1 (untuk python3 dan linux):
pip3 instal pip-autoremove
Langkah 2:
cd /home/usernamegoeshere/.local/bin/
Langkah 3:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
dan ubah semua pip menjadi pip3 Langkah ke-4: ./pip-autoremove packagenamegoeshere
pip
adalah a) sangat rapuh dan bergantung pada versi, juga b) dalam beberapa pemasangan pelanggan yang harus saya kerjakan, dipasang dengan hak administrator (walaupun paket tidak), maka menghancurkan atau menghapus instalan itu adalah kesedihan yang luar biasa dan Anda memiliki satu kesempatan untuk melakukannya dengan benar. c) konektivitas internet mungkin tidak bagus; untuk alasan keamanan, mesin perusahaan sering kali diblokir, jadi Anda tidak dapat menggunakan konektivitas langsung, dan Anda harus tahu sebelumnya semua yang Anda perlukan dan versinya, dan mengunduhnya.Jawaban:
Tidak, itu tidak menghapus paket dependensi. Itu hanya menghapus paket yang ditentukan:
Seperti yang Anda lihat paket-paket itu adalah dependensi dari
specloud
dan mereka masih di sana, tetapi bukanspecloud
paket itu sendiri.Seperti disebutkan di bawah, Anda dapat menginstal dan menggunakan utilitas pip-autoremove untuk menghapus paket plus dependensi yang tidak digunakan.
sumber
specloud
?Anda dapat menginstal dan menggunakan utilitas pip-autoremove untuk menghapus paket plus dependensi yang tidak digunakan.
sumber
pip-autoremove
(dash bukan garis bawah).pip_autoremove
memberi sayacommand not found
.python<version>
(ketika versi harus ditentukan). Dengan cara itu, kita perlu menyesuaikan namanyapip_autoremove
(tanda hubung tidak diizinkan sebagai nama paket). Misalnyapython3.8 pip_autoremove
berfungsi tetapipython3.8 pip-autoremove
tidak. Kalau tidak, seperti yang Anda tunjukkan, sebagai perintah terminal sederhanapip-autoremove
, ia berfungsi dengan sempurna :) —meski hanya versi python standar dari sistem yang digunakan. Terima kasih atas pesan Anda.saya telah berhasil menghapus dependensi suatu paket menggunakan garis bash ini:
ini bekerja pada pip 1.5.4
sumber
Saya telah menemukan solusinya walaupun mungkin agak sulit untuk dilakukan.
Langkah 1 (untuk python3 dan linux):
pip3 instal pip-autoremove
Langkah 2:
cd /home/usernamegoeshere/.local/bin/
Langkah 3:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
dan ubah semua pip menjadi pip3 Langkah ke-4: ./pip-autoremove packagenamegoeshere
Setidaknya, inilah yang bekerja untuk saya ...
sumber
Anda dapat mencoba untuk https://github.com/cls1991/pef . Ini akan menghapus paket dengan semua dependensinya.
sumber