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?

Hossein
sumber
1
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

figleaf == 0.6.1
nose == 1.1.2
pinocchio == 0.3
specloud == 0.4.5

$ pip uninstall specloud
$ pip freeze

figleaf == 0.6.1
nose == 1.1.2
pinocchio == 0.3

Seperti yang Anda lihat paket-paket itu adalah dependensi dari speclouddan mereka masih di sana, tetapi bukan specloudpaket itu sendiri.

Seperti disebutkan di bawah, Anda dapat menginstal dan menggunakan utilitas pip-autoremove untuk menghapus paket plus dependensi yang tidak digunakan.

BernardoBarreto
sumber
2
Bagaimana dengan paket ketergantungan paket eksklusif specloud?
Fusion
@Fusion Paket-paket itu adalah ketergantungan specloud.
BernardoBarreto
251

Anda dapat menginstal dan menggunakan utilitas pip-autoremove untuk menghapus paket plus dependensi yang tidak digunakan.

# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y
bwv549
sumber
9
Sayangnya itu tidak memiliki dukungan Python3 nyata, (lihat github.com/invl/pip-autoremove/issues/18 ).
asmaier
10
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

ini bekerja pada pip 1.5.4

linibou
sumber
40
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

Setidaknya, inilah yang bekerja untuk saya ...

david david
sumber
-1

Anda dapat mencoba untuk https://github.com/cls1991/pef . Ini akan menghapus paket dengan semua dependensinya.

cls1991
sumber
Sayangnya, pef hanya berfungsi di lingkungan virtual.
Bas
Hanya dalam pertimbangan keamanan, Anda dapat meretas kode, cukup matikan kode perlindungan.
cls1991
1
Apakah itu memastikan bahwa dependensi itu "menggantung" yaitu tidak dibutuhkan oleh distribusi lain?
wim
Ya, ini didasarkan pada penghitungan referensi.
cls1991
hei kawan saya telah bercabang dan memodifikasi kode. Silakan temukan tautan di bawah ini. github.com/nalangekrushna/pef
Krissh