Cách dễ nhất để loại bỏ tất cả các gói được cài đặt bởi pip là gì?


615

Tôi đang cố gắng sửa một trong số các virtualenv của mình - Tôi muốn đặt lại tất cả các thư viện đã cài đặt trở lại các thư viện phù hợp với sản xuất.

Có một cách nhanh chóng và dễ dàng để làm điều này với pip?


10
@patelshahrukh gỡ cài đặt python KHÔNG loại bỏ các gói pip. vui lòng TRÁNH làm điều đó, vì cả hai rất có thể KHÔNG LÀM VIỆC theo cách bạn nghĩ, , tùy thuộc vào cách bạn cài đặt lại python, có thể khiến máy của bạn ở trạng thái không ổn định, cần phải sửa nhiều hơn .
quả việt quất

điều này có thể giúp cho các gói được cài đặt trong chế độ phát triển hoặc chế độ có thể chỉnh sửa: stackoverflow.com/questions/17346619/ mẹo
Charlie Parker

Câu trả lời:


924

Tôi đã tìm thấy đoạn trích này như một giải pháp thay thế. Đó là một loại bỏ các thư viện duyên dáng hơn so với làm lại virtualenv:

pip freeze | xargs pip uninstall -y

Trong trường hợp bạn có các gói được cài đặt qua VCS, bạn cần loại trừ các dòng đó và xóa các gói theo cách thủ công (nâng cao từ các nhận xét bên dưới):

pip freeze | grep -v "^-e" | xargs pip uninstall -y

4
Tôi thấy đây là một giải pháp tốt, hoàn toàn vì nó không loại bỏ hoàn toàn môi trường ảo - tôi có thể đã thực hiện các thay đổi đối với ví dụ như postactivatesẽ vẫn còn.
Niceguydave

5
Sau khi chạy nó tôi nhận ra nó đã gỡ bỏ setuptoolsgói. Tôi đã giải quyết vấn đề theo hướng dẫn tại đây: stackoverflow.com/questions/7446187/ cấp
Dan

1
@ gerty3000 có, điều này sẽ (như câu hỏi yêu cầu) xóa tất cả các gói được cài đặt trong một ảo-env. trong môi trường của bạn, có lẽ setuptools sẽ được cài đặt tốt hơn tại một địa điểm toàn cầu?
blueberryfields

7
Bạn cũng có thể sử dụng pip freeze --exclude-editable | xargs pip uninstall -yđể bỏ qua các gói VCS mà không cần sử dụng mẫu grep
Connor Brinton

2
Và để gỡ cài đặt các gói có thể chỉnh sửa, hãy xem stackoverflow.com/questions/17346619
Dan Oak

318

Điều này sẽ hoạt động cho tất cả các hệ thống Mac, Windows và Linux. Để lấy danh sách tất cả các gói pip trong tệp tests.txt (Lưu ý: Điều này sẽ ghi đè yêu cầu.txt nếu tồn tại sẽ tạo cái mới, nếu bạn không muốn thay thế các yêu cầu cũ thì hãy đặt tên tệp khác trong tất cả các lệnh sau ở vị trí yêu cầu).

pip freeze > requirements.txt

Bây giờ để loại bỏ từng cái một

pip uninstall -r requirements.txt

Nếu chúng ta muốn loại bỏ tất cả cùng một lúc thì

pip uninstall -r requirements.txt -y

Nếu bạn đang làm việc trên một dự án hiện có requirements.txttệp và môi trường của bạn đã chuyển hướng, chỉ cần thay thế requirements.txttừ các ví dụ trên bằng toberemoved.txt. Sau đó, khi bạn đã trải qua các bước trên, bạn có thể sử dụng requirements.txtđể cập nhật môi trường hiện tại sạch sẽ của mình.

Và Đối với lệnh đơn mà không tạo bất kỳ tệp nào (Như @joeb đề xuất).

pip uninstall -y -r <(pip freeze)

11
có lẽ đáng nói đến là bạn buộc phải ghi đè lên tệp tests.txt của họ, trong trường hợp họ không biết. :)
Dave Gregory

4
Ngoài ra, nếu một người muốn xóa tất cả các gói, việc thêm "-y" sẽ làm như vậy. Ví dụ:pip uninstall -r requirements.txt -y
David Metcalfe

58
Bạn có thể sử dụng pip uninstall -y -r <(pip freeze)để làm mọi thứ trong một lần.
joeb

1
@joeb vâng, chúng tôi cũng có thể làm theo cách đó.
Harshad Kavathiya

1
@HarshadKavathiya bạn có thể sử dụng một tệp khác để lưu trữ đóng băng pip, như "current.txt", vì vậy, các yêu cầu có thể không bị ảnh hưởng
NikosKeyz

118

Điều này làm việc với mới nhất. Tôi nghĩ rằng đó là cách ngắn nhất và tuyên bố nhất để làm điều đó.

virtualenv --clear MYENV

Nhưng thông thường tôi chỉ xóa và tạo lại virtualenv vì các quy tắc bất biến!


7
Đây có phải là hiệu quả giống như chạy wipeenv? virtualenvwrapper.readthedocs.org/en/latest/ từ
Taylor Edmiston

Trên thực tế - có vẻ như (từ những gì tôi vừa gặp phải) trong wipeenvkhi trong môi trường gây ra lỗi và không xóa bất cứ điều gì nếu được sử dụng trong bối cảnh của một bản pip install -edựng phát triển, cố gắng sử dụng virtualenv --clear MYENVkhông gây ra lỗi và không xóa một trong các các gói mà bạn có thể đã cài đặt trước đó trong môi trường. Ít nhất đây là trường hợp trên OSX. Xem bitbucket.org/dhellmann/virtualenvwrapper/issues/211/iêu để biết thêm thông tin.
mpacer

2
wipeenv là một bí danh được cung cấp bởi virtualenvwrapper, vì vậy không phải ai cũng có nó.
Jonathan Hartley

2
tốt, đây là một loại mánh khóe bẩn thỉu, nhưng hoạt động như ma thuật. Tôi muốn mọi người sử dụng gỡ cài đặt pip -r tests.txt -y. Nó làm cho một dọn dẹp tuyệt vời.
Muema

84

Tôi muốn nâng câu trả lời này ra khỏi phần bình luận vì đó là một trong những giải pháp tao nhã nhất trong chủ đề. Tín dụng đầy đủ cho câu trả lời này được gửi đến @joeb .

pip uninstall -y -r <(pip freeze)

Điều này làm việc rất tốt cho tôi trong trường hợp sử dụng xóa thư mục gói người dùng của tôi bên ngoài ngữ cảnh của virtualenv mà nhiều câu trả lời ở trên không xử lý được.

Chỉnh sửa: Bất cứ ai cũng biết cách làm cho lệnh này hoạt động trong Makefile?

Phần thưởng: Một bí danh bash

Tôi thêm nó vào hồ sơ bash của tôi để thuận tiện:

alias pipuninstallall="pip uninstall -y -r <(pip freeze)"

Sau đó chạy:

pipuninstallall

Thay thế cho pipenv

Nếu bạn tình cờ sử dụng pipenv, bạn có thể chạy:

pipenv uninstall --all

8
Nên dễ dàng là # 1
Đánh dấu

Tôi thích nó nhưng nó không hoạt động trong trường hợp null ( pip freezekết quả là không có kết quả đầu ra nếu không có gói nào được cài đặt, và sau đó pip uninstallkhông may phàn nàn).
Eric G

Hmm bắt tốt. Có lẽ nó có thể được gói vào một hàm bash để kiểm tra xem đầu ra đóng băng pip có rỗng không. Tôi không thấy một cách tuyệt vời để đạt được điều đó trong khi giữ cho lệnh một lớp lót ngắn đẹp.
Taylor Edmiston

1
sử dụng sh theo mặc định, nhưng cú pháp thay thế <(...)là một bashism. Vì vậy, bạn có thể sử dụng bash -c "..." hoặc làm việc xung quanh bằng cách thực hiệnpip freeze | pip uninstall -r /dev/stdin
Caesar

Không hoạt động với Máy tính xách tay Azure:ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
SeaDude

54

Các câu trả lời khác sử dụng pip listhoặc pip freeze phải bao gồm--local khác, nó cũng sẽ gỡ cài đặt các gói được tìm thấy trong các không gian tên phổ biến.

Vì vậy, đây là đoạn trích tôi thường xuyên sử dụng

 pip freeze --local | xargs pip uninstall -y

Tham chiếu: pip freeze --help


Câu trả lời hay ... đã làm việc với tôi
igorkf

Điều này làm việc cho đến khi nó gặp một gói tạo ra lỗi này : ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.. Sau đó, tôi không thể gỡ bỏ bất kỳ mô-đun nữa.
SeaDude

39

Phương pháp 1 (với pip freeze)

pip freeze | xargs pip uninstall -y

Phương pháp 2 (với pip list)

pip list | awk '{print $1}' | xargs pip uninstall -y

Phương pháp 3 (với virtualenv)

virtualenv --clear MYENV

2
sudo là không cần thiết, và có thể rất nguy hiểm khi sử dụng mà không xem xét cẩn thận, vì nó ảnh hưởng đến việc thiết lập máy toàn cầu. xem câu trả lời này ví dụ: stackoverflow.com/questions/15028648/ từ
blueberryfields

6
Phương pháp 2 ( pip list) hoạt động tuyệt vời cho đến khi bạn vô tình gỡ cài đặt chính nó -_-
Justin

20

Tôi quản lý nó bằng cách làm như sau:

Tạo tệp yêu cầu có tên reqs.txt với danh sách các gói hiện được cài đặt

pip freeze > reqs.txt

sau đó gỡ cài đặt tất cả các gói từ reqs.txt

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

Tôi thích phương pháp này vì bạn luôn có một tệp yêu cầu pip để quay lại nếu bạn mắc lỗi. Nó cũng có thể lặp lại.


Đơn giản và thanh lịch, hoạt động như bùa mê
Satyaaditya

19

Cách nhanh nhất là làm lại virtualenv hoàn toàn. Tôi giả sử bạn có một tệp tests.txt phù hợp với sản xuất, nếu không:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt

2
Điều này thậm chí có xử lý trường hợp có cài đặt có thể chỉnh sửa (về cơ bản là cài đặt chế độ phát triển setuptools) đã tạo tệp .egg-information cục bộ sau đó can thiệp vào phần còn lại của quá trình cài đặt / gỡ cài đặt không? Vì nó là một tập hợp các tệp dường như không biết cách xử lý sự hiện diện của chúng và thay vì gỡ cài đặt bất cứ thứ gì, nó làm cho cấu trúc thư mục cục bộ trong MYENV hoàn thành với: `> Các tệp thực thi python mới trong MYENV / bin / python3.4> Ngoài ra tạo tệp thực thi trong MYENV / bin / python> Cài đặt setuptools, pip, wheel ... xong.` Nhưng MYENV không thiết lập lại môi trường!
mpacer

16

Trên Windows nếu pathcấu hình của bạn được cấu hình chính xác, bạn có thể sử dụng:

pip freeze > unins && pip uninstall -y -r unins && del unins

Nó sẽ là một trường hợp tương tự cho các hệ thống tương tự Unix:

pip freeze > unins && pip uninstall -y -r unins && rm unins

Chỉ là một cảnh báo rằng điều này không hoàn toàn chắc chắn vì bạn có thể gặp phải các vấn đề như 'Không tìm thấy tệp' nhưng dù sao nó cũng có thể hoạt động trong một số trường hợp

EDIT: Để rõ ràng: uninslà một tệp tùy ý có dữ liệu được ghi ra khi lệnh này thực thi:pip freeze > unins

Tập tin được viết lần lượt sau đó được sử dụng để gỡ cài đặt các gói đã nói ở trên với sự đồng ý ngụ ý / phê duyệt trước thông qua pip uninstall -y -r unins

Các tập tin cuối cùng đã bị xóa sau khi hoàn thành.



14

Đầu tiên, thêm tất cả các gói vào requirements.txt

pip freeze > requirements.txt

Sau đó loại bỏ tất cả

pip uninstall -y -r requirements.txt 

9

Đó là một câu hỏi cũ tôi biết nhưng tôi đã vấp phải nó để tham khảo trong tương lai bây giờ bạn có thể làm điều này:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r, - tập tin yêu cầu

Gỡ cài đặt tất cả các gói được liệt kê trong tệp yêu cầu nhất định. Tùy chọn này có thể được sử dụng nhiều lần.

từ tài liệu pip phiên bản 8.1


8

Đối với người dùng Windows, đây là những gì tôi sử dụng trên Windows PowerShell

 pip uninstall -y (pip freeze)

6

(thêm câu này làm câu trả lời, vì tôi không đủ uy tín để nhận xét về câu trả lời của @blueberryfields)

Câu trả lời của @blueberryfields hoạt động tốt, nhưng không thành công nếu không có gói để gỡ cài đặt (có thể là vấn đề nếu "gỡ cài đặt tất cả" này là một phần của tập lệnh hoặc tệp thực hiện). Điều này có thể được giải quyết xargs -rkhi sử dụng phiên bản GNU của xargs:

pip freeze --exclude-editable | xargs -r pip uninstall -y

từ man xargs:

-r, --no-run-if-trống

Nếu đầu vào tiêu chuẩn không chứa bất kỳ khoảng trống nào, không chạy lệnh. Thông thường, lệnh được chạy một lần ngay cả khi không có đầu vào. Tùy chọn này là một phần mở rộng GNU.


6
pip3 freeze --local | xargs pip3 uninstall -y

Trường hợp có thể là người ta phải chạy lệnh này nhiều lần để có được một sản phẩm nào pip3 freeze --local.


3

Đây là cách dễ nhất để tôi gỡ cài đặt tất cả các gói python.

from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
    system("pip3 uninstall {} -y -q".format(i.key))

2

Hỗ trợ đa nền tảng chỉ bằng cách sử dụng pip:

#!/usr/bin/env python

from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions

pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
    package.project_name
    for package in
    get_installed_distributions()
    if not package.location.endswith('dist-packages')
])

options.yes = True  # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction

try:
    print pip_uninstall.run(options, args)
except OSError as e:
    if e.errno != 13:
        raise e
    print >> stderr, "You lack permissions to uninstall this package.
                      Perhaps run with sudo? Exiting."
    exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.

2

Đây là lệnh làm việc cho tôi:

pip list | awk '{print $1}' | xargs pip uninstall -y

2

cách dễ dàng đa nền tảng và hoạt động trong pipenv là:

pip freeze 
pip uninstall -r requirement

bởi pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

nhưng sẽ không cập nhật piplock hoặc pipfile vì vậy hãy lưu ý


1

Nếu bạn đang chạy virtualenv:

virtualenv --clear </path/to/your/virtualenv>

ví dụ: nếu virtualenv của bạn /Users/you/.virtualenvs/projectxthì bạn sẽ chạy:

virtualenv --clear /Users/you/.virtualenvs/projectx

nếu bạn không biết env ảo của mình nằm ở đâu, bạn có thể chạy which pythontừ bên trong một env ảo được kích hoạt để có đường dẫn


1

Trong trường hợp của tôi, tôi đã vô tình cài đặt một số gói trên toàn cầu bằng cách sử dụng Homebrew - được cài đặt piptrên macOS. Cách dễ nhất để trở lại các gói mặc định là đơn giản:

$ brew reinstall python

Hoặc, nếu bạn đang sử dụng pip3:

$ brew reinstall python3

Câu trả lời này giả định quá nhiều về môi trường và không trực tiếp giải quyết vấn đề nếu bạn đang sử dụng pyenv chẳng hạn.
Đánh dấu

@Mark Chắc chắn nếu bạn đang sử dụng pyenv, thì bạn sẽ cần phải làm gì đó khác đi. Trong trường hợp phổ biến mà bạn không phải, tôi tin rằng đây là giải pháp đơn giản và ít hack nhất. Lưu ý rằng điều kiện này được nêu rõ ở đầu câu trả lời.
Radon Rosborough

OP đã hỏi về virtualenvs. Ông không đề cập cụ thể về việc sử dụng máy Mac hoặc bia để cài đặt Python. Do đó, bạn không thể cho rằng HĐH hoặc brew đã được sử dụng - và câu trả lời này sẽ không giải quyết được TẤT CẢ các điều kiện. Nếu bạn tập trung vào giải quyết môi trường bằng một công cụ như pip - bạn sẽ giải quyết bối cảnh của môi trường bạn đang ở. Hy vọng rằng có ý nghĩa.
Đánh dấu

1
@Mark Tôi hiểu vị trí của bạn. Chung ta co thể tỏ ra đông y để thể hiện chẳng đông y chut nao. Tôi chỉ muốn giúp đỡ những người từ Google nhấp vào liên kết có nhãn "Cách dễ nhất để xóa tất cả các gói được cài đặt bởi pip là gì?" khi họ thực sự muốn loại bỏ tất cả các gói được cài đặt trên toàn cầu bằng pip.
Radon Rosborough

Đồng ý với @RadonRosborough, tiêu đề liên kết là đại diện cho lý do tại sao tôi đến đây, ngay cả khi OP không thực sự hỏi cùng một câu hỏi.
Kenn Sebesta

1

Trong Command Shell của Windows, lệnh pip freeze | xargs pip uninstall -ysẽ không hoạt động. Vì vậy, đối với những người sử dụng Windows, tôi đã tìm ra một cách khác để làm như vậy.

  1. Sao chép tất cả tên của các gói pip đã cài đặt từ pip freezelệnh vào tệp .txt .
  2. Sau đó, đi đến vị trí của tệp .txt của bạn và chạy lệnhpip uninstall -r *textfile.txt*


1

Tôi sử dụng tùy chọn --user để gỡ cài đặt tất cả các gói được cài đặt trong trang web của người dùng.

pip3 đóng băng - người dùng | xargs pip3 gỡ cài đặt -y


Tôi tin rằng câu trả lời này không thêm nhiều thông tin mới, tôi muốn đề xuất một cải tiến cho một câu trả lời tương tự khác đã có sẵn như câu trả lời này: stackoverflow.com/a/45475070/11138259
sinoroc

-1

Pip không có cách nào để biết gói nào được cài đặt bởi nó và gói nào được cài đặt bởi trình quản lý gói của hệ thống của bạn. Đối với điều này, bạn sẽ cần phải làm một cái gì đó như thế này

đối với các bản phát hành dựa trên vòng / phút (thay thế python2.7 bằng phiên bản python mà bạn đã cài đặt pip):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

cho phân phối dựa trên tranh luận:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

sau đó để dọn sạch các thư mục trống còn lại:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

Tôi thấy câu trả lời hàng đầu rất sai lệch vì nó sẽ loại bỏ tất cả (hầu hết?) Các gói python khỏi bản phân phối của bạn và có thể để lại cho bạn một hệ thống bị hỏng.


Với tất cả sự tôn trọng, điều này dường như có thể so sánh. Tại sao không dpkg-query -S '/usr/lib/python2.7/*', trích xuất tên và dpkg-query -Ltừng tên để kết xuất các tệp liên quan? Nó đã có những biểu hiện được chuẩn bị. Phản đối chính của tôi là thay vì nhắm mục tiêu các gói được cài đặt ở bất cứ đâu trừ pip, bạn đã nhắm mục tiêu các gói được cài đặt bởi bất kỳ thứ gì khác ngoài trình quản lý mà bạn mong đợi và ở vị trí mà pip thường không được chạm vào. pip list -lliệt kê các gói nó được cài đặt cục bộ, và một số thậm chí sẽ pip install --target=.... Loại bỏ tất cả các thư mục hiện đang trống cũng sẽ cắn bạn!
John P
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.