Việc gỡ cài đặt một gói với các đường ống có thể loại bỏ các gói phụ thuộc?


153

Khi bạn sử dụng pipđể cài đặt một gói, tất cả các gói cần thiết cũng sẽ được cài đặt cùng với nó (phụ thuộc). Việc gỡ cài đặt gói đó cũng loại bỏ các gói phụ thuộc?


1
Tại sao bạn không thể thử nó và xem? Tôi sẽ làm chính xác điều đó để trả lời câu hỏi của bạn, nhưng vì một số lý do, pip không thể lấy chỉ số gói ở đây ngay bây giờ.
Thomas Vander Stichele

1
Tôi đã tìm thấy trong nhóm tin pip rằng mọi người không muốn chức năng này, ít nhất là bây giờ. Thật đáng tiếc!
Michel Samia

4
@ThomasVanderStichele vì sau đó câu trả lời sẽ không có sẵn trực tuyến cho các nhân viên Google trong tương lai :)
Đánh dấu

1
@Mark nó sẽ là, bạn chỉ cần viết ra câu trả lời cho câu hỏi của riêng bạn ở đây.
Thomas Vander Stichele

5
@ThomasVanderStichele: Tôi không phải là OP, nhưng đây là lý do tại sao đây là một câu hỏi và trả lời rất hợp pháp cho SO: piplà một) nổi tiếng là dễ vỡ và phụ thuộc vào phiên bản, cũng b) trong một số cài đặt của khách hàng mà tôi phải làm việc, nó đã được cài đặt quyền quản trị viên (mặc dù các gói không có), do đó phá vỡ hoặc gỡ cài đặt nó là điều vô cùng đau buồn và bạn đã có một lần để thực hiện đúng. c) kết nối internet có thể không tốt; vì lý do bảo mật, các máy của công ty thường được tường lửa, vì vậy bạn không thể sử dụng kết nối trực tiếp và bạn phải biết trước mọi thứ bạn cần và phiên bản của nó, và tải xuống.
smci

Câu trả lời:


79

Không, nó không gỡ cài đặt các gói phụ thuộc. Nó chỉ loại bỏ gói được chỉ định:

$ pip install specloud
$ pip freeze # all the packages here are dependencies of specloud package

figleaf == 0.6.1
mũi == 1.1.2
pinocchio == 0.3
specloud == 0.4.5

$ pip uninstall specloud
$ pip freeze

figleaf == 0.6.1
mũi == 1.1.2
pinocchio == 0.3

Như bạn có thể thấy các gói đó là phụ thuộc từ specloudvà chúng vẫn ở đó, nhưng không phải là specloudgói đó.

Như đã đề cập dưới đây, Bạn có thể cài đặt và sử dụng tiện ích pip-autoremove để xóa gói cộng với các phụ thuộc không sử dụng.


2
Những gì về gói phụ thuộc độc quyền của specloudgói?
Hợp nhất

@Fusion Những gói đó là sự phụ thuộc của specloud.
BernardoBarreto

249

Bạn có thể cài đặt và sử dụng tiện ích pip-autoremove để xóa gói cộng với các phụ thuộc không sử dụng.

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

9
Thật không may, nó không có hỗ trợ Python3 thực sự, tuy nhiên (xem github.com/invl/pip-autoremove/issues/18 ).
asmaier

10
Làm việc tốt với tôi trong Python 3 vào tháng 10 năm 2019.
đồ ăn nhẹ

@ yêu.by.Jesus - Tôi đang dùng python 3.8.3 và tôi đã thử nghiệm và vẫn thấy lệnh được thực thi dưới dạng pip-autoremove(dấu gạch ngang không gạch dưới). pip_autoremovemang lại cho tôi command not found.
bwv549

@ bwv549 Tôi phải giải thích rằng tôi đã thực thi nó thông qua python<version>(khi phiên bản phải được chỉ định). Theo cách đó, chúng ta cần điều chỉnh tên thành pip_autoremove(dấu gạch ngang không được phép làm tên gói). Ví dụ python3.8 pip_autoremovehoạt động nhưng python3.8 pip-autoremovekhông. Mặt khác, như bạn đã chỉ ra, như một lệnh đầu cuối đơn giản pip-autoremove, nó hoạt động hoàn hảo :) Mặc dù chỉ là phiên bản python mặc định của hệ thống được sử dụng. Cảm ơn tin nhắn của bạn.
yêu.by.Jesus

9

Tôi đã loại bỏ thành công các phụ thuộc của gói bằng cách sử dụng dòng bash này:

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

cái này hoạt động trên pip 1.5.4


40
Mặc dù về mặt kỹ thuật, giải pháp này đã loại bỏ thành công tất cả các phụ thuộc, như đã đề cập trong các câu trả lời khác, nó cũng gỡ cài đặt các phụ thuộc không phảiduy nhất cho mục tiêu , bao gồm cả các phụ thuộc được cài đặt từ các gói hệ thống. Ví dụ, trên hệ thống của tôi, tập lệnh này cuối cùng đã thất bại vì gói mục tiêu có các phụ thuộc chung với pip, vì vậy pip đã gỡ cài đặt các phụ thuộc của chính nó trước khi tập lệnh có thể kết thúc và sau đó thất bại.
nham hiểm

19
Coi chừng điều này chỉ loại bỏ các phụ thuộc xuống cấp tiếp theo, nhưng không loại bỏ các phụ thuộc của các phụ thuộc đó.
tamakisapes

0

Tôi đã tìm ra giải pháp mặc dù có thể hơi khó thực hiện đối với một số người.

Bước 1 (đối với python3 và linux):
pip3 cài đặt pip-autoremove
Bước 2:
cd /home/usernamegoeshere/.local/bin/
Bước 3:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
và thay đổi tất cả các pip thành pip3 Bước 4: ./pip-autoremove packagenamegoeshere

Ít nhất, đây là những gì làm việc cho tôi ...


-1

Bạn có thể dùng thử https://github.com/cls1991/pef . Nó sẽ loại bỏ gói với tất cả các phụ thuộc của nó.


pef dường như chỉ hoạt động trong môi trường ảo, thật không may.
Bas

Chỉ cần cân nhắc về an toàn, bạn có thể hack mã, chỉ cần tắt mã bảo vệ.
cls1991

1
Liệu nó có chắc chắn rằng những phụ thuộc đó là "lơ lửng" tức là không cần thiết bởi các bản phân phối khác không?
wim

Vâng, nó dựa trên tính tham khảo.
cls1991

hey guys tôi đã rẽ nhánh và sửa đổi mã. Vui lòng tìm liên kết dưới đây. github.com/nalangekrushna/pef
Krissh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.