Câu hỏi Nâng cấp tất cả các gói bằng pip


Có thể nâng cấp tất cả các gói Python cùng một lúc với pip?

Lưu ý rằng có yêu cầu tính năng cho điều này trên bộ theo dõi vấn đề chính thức.


1425
2018-04-27 09:23


gốc


Wow .. họ sáp nhập vào github và bây giờ cuộc thảo luận cho vấn đề này là lộn xộn, hàng chục bài đăng của người bảo trì github (có thể được di chuyển bằng cách sử dụng tập lệnh xóa thông tin người dùng). - levesque
Cẩn thận thối phần mềm- phụ thuộc nâng cấp có thể phá vỡ ứng dụng của bạn. Bạn có thể liệt kê chính xác phiên bản của tất cả các gói đã cài đặt với pip freeze (như bundle install hoặc là npm shrinkwrap). Tốt nhất để lưu một bản sao của điều đó trước khi mày mò. - Colonel Panic
Hãy cẩn thận khi làm điều này, bạn vít của bạn pip cài đặt, khi bạn nâng cấp requests. Thông báo lỗi là cannot import name IncompleteRead. - Paul Rooney
Tôi đã thử một loạt các câu trả lời và một câu trả lời cho điểm mới hơn (và do đó cho điểm thấp) tạo ra một kết quả tốt hơn nhiều: stackoverflow.com/questions/2720014/… - FauChristian
Cập nhật và yêu cầu tính năng cập nhật: github.com/pypa/pip/issues/4551 - cledoux


Các câu trả lời:


Chưa có cờ tích hợp sẵn nhưng bạn có thể sử dụng

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

Lưu ý: có những biến thể tiềm năng vô hạn cho việc này. Tôi đang cố gắng để giữ câu trả lời này ngắn gọn và đơn giản, nhưng xin vui lòng đề nghị các biến thể trong các ý kiến!

Trong phiên bản cũ hơn của pip, bạn có thể sử dụng thay vào đó:

pip freeze --local | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

Các grep là bỏ qua các định nghĩa gói có thể chỉnh sửa ("-e"), như được gợi ý bởi @jawache. (Có, bạn có thể thay thế grep+cut với sed hoặc là awk hoặc là perl hoặc là...).

Các -n1 gắn cờ cho xargs ngăn chặn dừng mọi thứ nếu cập nhật một gói không thành công (cảm ơn @andsens).


1671
2017-08-10 19:56



Right :( Vấn đề hiện đang tồn tại github.com/pypa/pip/issues/59 . Nhưng mọi đề xuất dường như được trả lời bằng "Vâng, nhưng tôi cũng chắc chắn nếu X là đúng cách để làm Y" ... Bây giờ là tốt hơn bao giờ hết? Thực tiễn đánh bại sự tinh khiết? :( - rbp
Nó cũng in các gói được cài đặt với trình quản lý gói thông thường (như apt-get hoặc Synaptic). Nếu tôi thực hiện điều này pip install -U, nó sẽ cập nhật tất cả các gói. Tôi sợ nó có thể gây ra một số xung đột với apt-get. - Jabba
Làm thế nào về việc thay đổi grep để: egrep -v '^ (\ - e | #)' (tôi nhận được dòng này khi chạy nó trên ubuntu 12.10: "## FIXME: không thể tìm thấy URL svn trong dependency_links cho gói này:". - LasseValentini
Tôi sẽ ném vào một tee trước khi thực hiện nâng cấp thực tế để bạn có thể nhận danh sách các phiên bản gốc. Ví dụ. pip freeze --local | tee before_upgrade.txt | ... Bằng cách đó nó sẽ dễ dàng hơn để hoàn nguyên nếu có bất kỳ vấn đề. - Emil H
Tôi đã thêm -H đến sudo để tránh một thông báo lỗi gây phiền nhiễu: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U - Mario S


Bạn có thể sử dụng mã Python sau. không giống pip freeze, điều này sẽ không in cảnh báo và lỗi FIXME.

import pip
from subprocess import call

packages = [dist.project_name for dist in pip.get_installed_distributions()]
call("pip install --upgrade " + ' '.join(packages), shell=True)

515
2018-04-30 03:31



Điều này hoạt động đáng kinh ngạc tốt ... Nó luôn luôn rất thỏa mãn khi một nhiệm vụ mất một REALLY thời gian dài... và cung cấp cho bạn một bó công cụ mới! PS: Chạy nó dưới dạng root nếu bạn đang sử dụng OS X! - Alex Gray
Không có cách nào để cài đặt bằng cách sử dụng pip mà không cần gọi một tiến trình con? Cái gì đó như import pip  pip.install('packagename')? - endolith
Là một kịch bản Python, phương thức này cũng hoạt động trên Windows. - Adrian Spinei
Tôi bọc nó lên trong một fabfile.py. Cảm ơn! - Josh K
Điều này không hoạt động nữa với PIP 10.0. Tôi nhận được một "module pip không có thuộc tính get_installed_distributions" lỗi. - Cody Dostal


Nâng cấp tất cả các gói nội bộ; bạn đã có thể sử dụng pip-review:

$ pip install pip-review
$ pip-review --local --interactive

pip-review là một cái nĩa của pip-tools. Xem pip-tools vấn đề được đề cập bởi @knedlsepp. pip-review gói hoạt động nhưng pip-tools gói không còn hoạt động.

pip-review hoạt động trên Windows kể từ phiên bản 0.5.


504
2018-04-29 00:34



Lưu ý - điều này có vẻ tuyệt vời nhưng hiện tại vô dụng trên Windows vì nó cài đặt các tập lệnh không có phần mở rộng. - julianz
@julianz: vâng. Nó là một vấn đề được biết. Thêm vào .py tiện ích mở rộng làm giải pháp. Mặc dù có những cách giải độc khác như gọi điện cat, sort trong mã. - jfs
@mkoistinen Đó là một công cụ tốt nhưng cho đến khi nó được sáp nhập vào PIP, nó có nghĩa là cài đặt một cái gì đó bổ sung mà không phải ai cũng có thể mong muốn làm. - Wernight
@Daniel: pip-công cụ không còn hoạt động, pip-xem xét (ngã ba của pip-công cụ) hoạt động. - jfs
pip-review hoạt động tốt (ít nhất là cho phiên bản Python 3.5.0) - FredrikHedman


Hoạt động trên Windows. Nên tốt cho người khác nữa. ($ là bất kỳ thư mục nào bạn đang ở, trong dấu nhắc lệnh. Ví dụ: C: / Users / Username>)

làm

$ pip freeze > requirements.txt

mở tệp văn bản, thay thế == bằng> =

sau đó làm

$ pip install -r requirements.txt --upgrade

Nếu bạn có một vấn đề với một gói nhất định trì hoãn việc nâng cấp (đôi khi numpy), chỉ cần vào thư mục ($), nhận xét tên (thêm một số trước đó) và chạy nâng cấp lại. Sau đó bạn có thể bỏ ghi chú lại phần đó. Điều này cũng rất tốt cho việc sao chép môi trường toàn cầu python.

Tôi cũng thích phương pháp pip-review:

py2
$ pip install pip-review

$ pip-review --local --interactive

py3
$ pip3 install pip-review

$ py -3 -m pip_review --local --interactive

Bạn có thể chọn 'a' để nâng cấp tất cả các gói; nếu một nâng cấp không thành công, hãy chạy lại và tiếp tục ở bước tiếp theo.


183
2017-11-12 09:20



Bạn nên xóa requirements.txt'S =={version}. Ví dụ: python-dateutil==2.4.2 đến python-dateutil cho tất cả các dòng. - youngminz
Tôi thấy rằng điều này đã không thực sự nâng cấp các gói trên macOS. - jkooker
@youngminz Tôi sẽ recommand nhanh chóng 'Thay thế tất cả "=="> "> ="' trong trình soạn thảo / ide của bạn trước khi chạy 'pip install ...' để sửa lỗi này - Amaury Liet
Đây chính là điều tôi muốn. Tôi có một virtualenv python và tôi cần giữ nó cập nhật. Nó nâng cấp tất cả các gói hiện có trong requirements.txt. - alex
cho linux: $ pip freeze | cut -d '=' -f1> requirements.txt để xóa phiên bản - Batsu


Phiên bản Windows sau khi tư vấn xuất sắc tài liệu cho FOR bởi Rob van der Woude

for /F "delims===" %i in ('pip freeze -l') do pip install -U %i

88
2018-02-25 18:04



for /F "delims= " %i in ('pip list --outdated') do pip install -U %i        Nhanh hơn vì nó sẽ chỉ thử và cập nhật các gói "lỗi thời" - Refael Ackermann
@RefaelAckermann Tôi nghi ngờ điều này sẽ chậm hơn so với bản gốc :) Để biết gói nào là lỗi thời, pip phải kiểm tra phiên bản mới nhất của mỗi gói là gì. Nó thực hiện chính xác giống như bước đầu tiên khi cập nhật và không tiếp tục nếu không có phiên bản mới hơn. Tuy nhiên trong pip phiên bản của bạn sẽ kiểm tra phiên bản hai lần, lần đầu tiên để thiết lập danh sách các gói đã lỗi thời và lần thứ hai khi cập nhật các gói trong danh sách này. - Piotr Dobrogost
@PiotrDobrogost, Nếu chúng ta muốn phân tích một cách nghiêm ngặt;) n là số gói đã cài đặt và m <= n số lượng các gói "lỗi thời". của bạn sẽ spin-up pip cho TẤT CẢ các gói cho 1 + n thực thi pip với n*log(n) tra cứu web cho các phiên bản và tất cả các phụ thuộc và m tải xuống và cài đặt. Tôi sẽ làm n tra cứu web cho --outdated cuộc gọi sau đó sẽ chỉ quay m  pip cuộc gọi với m*log(n) tra cứu web cho các phụ thuộc + m tải xuống và cài đặt. vì nếu m << n Tôi thắng :) - Refael Ackermann
@RefaelAckermann Quay lên pip là thứ tự cường độ nhanh hơn so với việc kiểm tra phiên bản của một gói trên mạng vì vậy đó là số lượng kiểm tra cần được tối ưu hóa chứ không phải số lượng spin up. Tôi làm cho n kiểm tra, bạn làm cho kiểm tra n + m. - Piotr Dobrogost


Bạn chỉ có thể in các gói đã lỗi thời

pip freeze | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:'

70
2018-06-10 12:50



Bên trong virtualenv, tôi làm như sau: pip freeze --local | cut -d = -f 1 | xargs -n 1 pip search | grep -B2 'LATEST:' - Jeremy Blanchard
Ngày nay bạn cũng có thể làm điều đó với python -m pip list outdated (mặc dù nó không có định dạng yêu cầu). - P1h3r1e3d13


Một lớp lót sau đây có thể chứng minh sự trợ giúp:

pip list --format legacy --outdated | sed 's/(.*//g' | xargs -n1 pip install -U

xargs -n1 tiếp tục nếu xảy ra lỗi.

Nếu bạn cần kiểm soát "hạt mịn" hơn những gì bị bỏ qua và điều gì gây ra lỗi, bạn không nên thêm -n1 gắn cờ và xác định rõ ràng các lỗi cần bỏ qua, bằng cách "đường ống" dòng sau cho từng lỗi riêng biệt:

| sed 's/^<First characters of the error>.*//'

Đây là một ví dụ làm việc:

pip list --format legacy --outdated | sed 's/(.*//g' | sed 's/^<First characters of the first error>.*//' | sed 's/^<First characters of the second error>.*//' | xargs pip install -U

57
2018-03-07 20:25



Đã phải thêm bộ lọc cho các dòng bắt đầu bằng 'Có thể' và 'Một số' vì dường như pip gửi cảnh báo tới stdout :( - Chip Camden
OK, điều này là công bằng: Bạn có thể thêm nhiều | sed 's/^<First characters of the error>.*//' khi cần thiết. Cảm ơn bạn! - raratiru
Hoặc là: pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade - Jens