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?
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?
Câu trả lời:
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
postactivate
sẽ vẫn còn.
setuptools
gói. Tôi đã giải quyết vấn đề theo hướng dẫn tại đây: stackoverflow.com/questions/7446187/ cấp
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
Đ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.txt
tệp và môi trường của bạn đã chuyển hướng, chỉ cần thay thế requirements.txt
từ 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)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
để làm mọi thứ trong một lần.
Đ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!
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/ từ
wipeenv
khi 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 -e
dựng phát triển, cố gắng sử dụng virtualenv --clear MYENV
khô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.
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ó.
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?
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
Nếu bạn tình cờ sử dụng pipenv, bạn có thể chạy:
pipenv uninstall --all
pip freeze
kế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 uninstall
không may phàn nàn).
<(...)
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
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.
Các câu trả lời khác sử dụng pip list
hoặ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
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.
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
pip list
) hoạt động tuyệt vời cho đến khi bạn vô tình gỡ cài đặt chính nó -_-
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.
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
Trên Windows nếu path
cấ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: unins
là 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.
Đó 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
(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 -r
khi 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.
Đâ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))
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.
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 ý
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/projectx
thì 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 python
từ bên trong một env ảo được kích hoạt để có đường dẫn
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 pip
trê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
Trong Command Shell của Windows, lệnh
pip freeze | xargs pip uninstall -y
sẽ 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.
pip freeze
lệnh vào tệp .txt .pip uninstall -r *textfile.txt*
Nếu bạn đang sử dụng pew
, bạn có thể sử dụng lệnh wipeenv :
pew wipeenv [env]
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
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.
dpkg-query -S '/usr/lib/python2.7/*'
, trích xuất tên và dpkg-query -L
từ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 -l
liệ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!