การถอนการติดตั้งแพคเกจด้วย“ pip” จะลบแพ็คเกจที่อ้างอิงหรือไม่


153

เมื่อคุณใช้pipเพื่อติดตั้งแพคเกจแพคเกจที่จำเป็นทั้งหมดจะถูกติดตั้งด้วย (การอ้างอิง) การถอนการติดตั้งแพคเกจนั้นยังลบแพ็คเกจที่ต้องพึ่งพาหรือไม่


1
ทำไมคุณลองและดูไม่ได้? ฉันจะทำอย่างนั้นเพื่อตอบคำถามของคุณ แต่ด้วยเหตุผลบางประการ pip ไม่สามารถรับดัชนีแพ็คเกจได้ที่นี่ตอนนี้
Thomas Vander Stichele

1
ฉันพบในกลุ่มข่าวสาร pipที่ pip คนไม่ต้องการฟังก์ชั่นนี้อย่างน้อยตอนนี้ ช่างเป็นอะไรกันแน่!
Michel Samia

4
@ThomasVanderStichele เพราะเมื่อนั้นคำตอบจะไม่สามารถให้บริการออนไลน์สำหรับผู้ใช้ Google ในอนาคต :)
Mark

1
@ ทำตามมันได้คุณแค่เขียนคำตอบสำหรับคำถามของคุณเองที่นี่
Thomas Vander Stichele

5
@ThomasVanderStichele: ฉันไม่ใช่ OP แต่นี่คือเหตุผลว่าทำไมนี่จึงเป็นคำถามและคำตอบที่ถูกต้องสำหรับ SO: pipa) a) การเปราะบางและขึ้นอยู่กับรุ่นฉาวโฉ่และข) ในการติดตั้งของลูกค้าบางรายที่ฉันต้องทำงานด้วย สิทธิ์ของผู้ดูแลระบบ (แม้ว่าจะไม่ใช่แพ็คเกจ) ดังนั้นการทำลายหรือถอนการติดตั้งนั้นเป็นเรื่องที่น่าเศร้าใจอย่างมากและคุณมีภาพเดียวที่ต้องทำ c) การเชื่อมต่ออินเทอร์เน็ตอาจไม่ยอดเยี่ยม ด้วยเหตุผลด้านความปลอดภัยเครื่องขององค์กรมักจะมีไฟร์วอลล์ดังนั้นคุณจึงไม่สามารถทำการเชื่อมต่อโดยตรงได้และคุณต้องรู้ล่วงหน้าทุกอย่างที่คุณต้องการและเวอร์ชั่นและดาวน์โหลด
smci

คำตอบ:


81

ไม่ไม่ได้ถอนการติดตั้งแพ็คเกจการขึ้นต่อกัน จะลบแพ็คเกจที่ระบุเท่านั้น:

$ 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

ในขณะที่คุณสามารถดูแพคเกจเหล่านั้นเป็นการอ้างอิงจากspecloudและพวกเขายังคงอยู่ที่นั่น แต่ไม่ใช่specloudแพคเกจเอง

ตามที่ระบุไว้ด้านล่างคุณสามารถติดตั้งและใช้ยูทิลิตี้pip-autoremoveเพื่อลบแพ็คเกจรวมถึงการขึ้นต่อกันที่ไม่ได้ใช้


2
สิ่งที่เกี่ยวกับแพคเกจพิเศษของแพคเกจพึ่งพาspecloud?
ฟิวชั่น

@ ฟิวชั่นแพคเกจเหล่านั้นคือการพึ่งพาของ specloud
BernardoBarreto

251

คุณสามารถติดตั้งและใช้ยูทิลิตี้pip-autoremoveเพื่อลบแพ็คเกจรวมถึงการพึ่งพาที่ไม่ได้ใช้

# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y

9
น่าเสียดายที่ยังไม่มีการสนับสนุน Python3 จริง ๆ (ดูgithub.com/invl/pip-autoremove/issues/18 )
asmaier

10
ทำงานได้ดีสำหรับฉันใน Python 3 ตั้งแต่วันที่ตุลาคม 2562
ว่าง

@ loves.by.Jesus - ฉันใช้ python 3.8.3 และฉันทดสอบและยังเห็นคำสั่งที่ดำเนินการเป็นpip-autoremove(เส้นประไม่ใช่ขีดเส้นใต้) ให้ฉันpip_autoremove command not found
bwv549

@ bwv549 ฉันต้องอธิบายว่าฉันดำเนินการผ่านpython<version>(เมื่อต้องระบุเวอร์ชัน) ด้วยวิธีนี้เราจำเป็นต้องปรับชื่อเป็นpip_autoremove(ไม่อนุญาตให้มีเครื่องหมายขีดกลางเป็นชื่อแพ็คเกจ) ตัวอย่างเช่นใช้python3.8 pip_autoremoveงานได้ แต่ใช้python3.8 pip-autoremoveไม่ได้ มิฉะนั้นอย่างที่คุณได้ชี้ให้เห็นว่าคำสั่งเทอร์มินัลอย่างง่ายpip-autoremoveมันทำงานได้อย่างสมบูรณ์แบบ :) - แม้ว่าจะใช้เพียงเวอร์ชันเริ่มต้นของระบบไพ ธ อน ขอบคุณสำหรับข้อความ.
รัก. โดยพระเยซูคริสต์

8

ฉันลบการอ้างอิงของแพคเกจสำเร็จแล้วโดยใช้ bash line นี้:

for dep in $(pip show somepackage | grep Requires | sed 's/Requires: //g; s/,//g') ; do pip uninstall -y $dep ; done

สิ่งนี้ใช้ได้กับ pip 1.5.4


41
แม้ว่าในทางเทคนิคแล้วโซลูชันนี้จะทำการลบการพึ่งพาทั้งหมดได้สำเร็จตามที่กล่าวไว้ในคำตอบอื่น ๆ แต่ก็ยังถอนการติดตั้งการพึ่งพาที่ไม่ซ้ำกับเป้าหมายรวมถึงที่ติดตั้งจากแพ็คเกจระบบ ตัวอย่างเช่นในระบบของฉันสคริปต์นี้ล้มเหลวในที่สุดเนื่องจากแพคเกจเป้าหมายมีการอ้างอิงร่วมกันกับ pip ดังนั้น pip จึงถอนการติดตั้งการอ้างอิงของตนเองก่อนที่สคริปต์จะเสร็จสิ้นและล้มเหลว
sinisterstuf

19
ระวังเอานี้เพียงระดับถัดไปลงพึ่งพา แต่ไม่ได้อ้างอิงการอ้างอิงเหล่านั้น
tamakisquare

0

ฉันได้พบวิธีแก้ปัญหาแม้ว่าบางคนอาจจะทำได้ยาก

ขั้นตอนที่ 1 (สำหรับ python3 และ linux):
pip3 install pip-autoremove
ขั้นตอนที่สอง:
cd /home/usernamegoeshere/.local/bin/
ขั้นตอนที่ 3:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
และเปลี่ยน pip ทั้งหมดเป็น pip3 ขั้นตอนที่ 4: ./pip-autoremove packagenamegoeshere

อย่างน้อยนี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน ...


-1

คุณอาจจะต้องลองหาhttps://github.com/cls1991/pef มันจะลบแพ็คเกจที่มีการอ้างอิงทั้งหมด


ดูเหมือนว่า PEF จะทำงานในสภาพแวดล้อมเสมือนจริงเท่านั้น
Bas

มันเป็นเพียงข้อพิจารณาด้านความปลอดภัยคุณสามารถแฮ็ครหัสได้เพียงแค่ปิดรหัสป้องกัน
cls1991

1
มันทำให้แน่ใจว่าการพึ่งพาเหล่านั้นเป็น "ห้อยต่องแต่ง" เช่นไม่จำเป็นโดยการกระจายอื่น ๆ ?
Wim

ใช่มันขึ้นอยู่กับการนับการอ้างอิง
cls1991

เฮ้พวกฉันได้แยกและแก้ไขรหัสแล้ว กรุณาหาลิงค์ด้านล่าง github.com/nalangekrushna/pef
Krissh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.