Làm cách nào để nâng cấp tất cả các gói Python với pip?


2051

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

Lưu ý : có một yêu cầu tính năng cho việc này trên trình theo dõi vấn đề chính thức.


37
Coi chừng phần mềm quay phần 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ê phiên bản chính xác của tất cả các gói đã cài đặt với pip freeze(như bundle installhoặc npm shrinkwrap). Tốt nhất để lưu một bản sao đó trước khi mày mò.
Đại tá Panic

Cẩn thận khi làm điều này, bạn vặn pipcài đặt của bạn lên, khi bạn nâng cấp requests. Thông báo lỗi là cannot import name IncompleteRead.
Paul Rooney

11
Tôi đã thử một loạt các câu trả lời và một câu trả lời mới hơn (và do đó điểm thấp) tạo ra kết quả tốt hơn nhiều: stackoverflow.com/questions/2720014/
Kẻ

Yêu cầu và thảo luận về tính năng cập nhật: github.com/pypa/pip/issues/4551
cledoux

Câu hỏi này vừa cũ vừa hữu dụng, tôi chỉ muốn cảnh báo cho bất cứ ai đến đây từ bây giờ rằng bây giờ có một cách chính thức mới tốt nhất để làm tất cả những điều này: pipenv. Tài liệu ở đây: docs.pipenv.org/basics và tác giả Pycon 2018 nói về nó ở đây: youtube.com/watch?v=GBQAKldqgZs . Chúc mừng mã hóa!
Malik A. Rumi

Câu trả lời:


2260

Chưa có cờ tích hợp, 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 vui lòng đề xuất các biến thể trong các nhận xét!

Trong phiên bản cũ hơn pip, bạn có thể sử dụng thay thế:

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

Đây greplà bỏ qua các định nghĩa gói có thể chỉnh sửa ("-e"), như được đề xuất bởi @jawache. (Vâng, bạn có thể thay thế grep+ cutvới sedhoặc awkhoặc perlhoặc ...).

Các -n1lá cờ cho xargsngăn chặn dừng tất cả mọi thứ nếu cập nhật một gói thất bại (nhờ @andsens ).


59
Phải :( Vấn đề hiện đang tồn tại 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 quá chắc chắn nếu X là cách đúng đắn để làm Y" ... Bây giờ tốt hơn bao giờ hết? Thực tế đánh bại sự thuần khiết? :(
rbp

20
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

8
Cách thay đổi grep thành: egrep -v '^ (\ - e | #)' (tôi nhận được dòng này khi chạy nó trên ub Ubuntu 12.10: "## FIXME: không thể tìm thấy URL svn trong phụ thuộc_links cho gói này:".
LasseValentini

32
Tôi sẽ tham gia teetrước khi thực hiện nâng cấp thực tế để bạn có thể nhận được danh sách các phiên bản gốc. Ví dụ: pip freeze --local | tee before_upgrade.txt | ...Cách đó sẽ dễ dàng hoàn nguyên hơn nếu có bất kỳ vấn đề nào.
Emil H

10
Tôi đã thêm -Hvào sudođể tránh thông báo lỗi khó chịu: $ pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 sudo -H pip install -U
Mario S

683

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

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)

Đối với pip> = 10.0.1

import pkg_resources
from subprocess import call

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

21
Điều này hoạt động rất tốt, thật tuyệt vời. Nó luôn luôn rất thỏa mãn khi một nhiệm vụ mất nhiều thời gian thực sự và cung cấp cho bạn một loạt các công cụ mới! PS: Chạy nó với quyền root nếu bạn đang dùng OS X!
Alex Gray

52
Có cách nào để cài đặt bằng pip mà không gọi một quy trình con không? Một cái gì đó như thế import pip pip.install('packagename')nào?
endolith

6
Tôi đã gói nó trong một fabfile.py . Cảm ơn!
Josh K

5
@BenMezger: Bạn thực sự không nên sử dụng các gói hệ thống trong virtualenv của mình. Bạn cũng thực sự không nên chạy nhiều hơn một số chương trình đáng tin cậy, nổi tiếng là root. Chạy virtualenvs của bạn với --no-site-gói (mặc định trong các phiên bản gần đây).
jeffcook2150

3
Đồng ý với câu hỏi này, câu trả lời được chọn (ở trên) không thành công nếu không thể tìm thấy gói nào nữa. Kịch bản này chỉ đơn giản là tiếp tục các gói tiếp theo, tuyệt vời.
Josh

643

Để nâng cấp tất cả các gói địa phương; bạn có thể sử dụng pip-review:

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

pip-reviewlà một ngã ba của pip-tools. Xem pip-toolsvấn đề được đề cập bởi @knedlsepp . pip-reviewgói hoạt động nhưng pip-toolsgói không còn hoạt động.

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


2
@hauzer: Nó không hỗ trợ Python 3. Mặc dù nó có thể là một lỗi
jfs

7
@mkoistinen Đó là một công cụ tốt nhưng cho đến khi nó được hợp nhất trong PIP, điều đó có nghĩa là cài đặt một cái gì đó bổ sung mà không phải ai cũng có thể muốn làm.
Wernight

2
@Daniel: pip-tools không còn hoạt động, pip-review (fork của pip-tools) hoạt động.
jfs

7
Pip-review hoạt động tốt (ít nhất là cho phiên bản Python 3.5.0)
FredrikHedman

15
Để cập nhật tất cả mà không có chế độ tương tác:pip-review --local --auto
Dlamini

333

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 >=và thực thi

$ pip install -r requirements.txt --upgrade

Nếu bạn gặp vấn đề với một gói nhất định làm trì hoãn việc nâng cấp (đôi khi numpy), chỉ cần truy cập thư mục ($), nhận xét tên (thêm # trước nó) và chạy lại nâng cấp. Bạn có thể bỏ qua phần đó trở lại. Điều này cũng tuyệt vời để sao chép môi trường toàn cầu python.


Cách khác:

Tôi cũng thích phương pháp xem xét pip:

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 lần nâng cấp thất bại, hãy chạy lại và tiếp tục ở lần nâng cấp tiếp theo.


29
Bạn nên loại bỏ requirements.txt's =={version}. Ví dụ: python-dateutil==2.4.2để python-dateutilcho tất cả các dòng.
youngminz

4
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

10
@youngminz Tôi muốn giới thiệu và nhanh chóng 'Thay thế tất cả "=="> "> ="' trong trình chỉnh sửa / ide của bạn trước khi chạy 'pip install ...' để khắc phục điều này
Amaury Liet

7
cho linux: $ pip freeze | cut -d '=' -f1> requirements.txtđể xóa phiên bản
Cavaz

1
Nếu hệ vỏ bạn sử dụng là bash, bạn có thể rút ngắn nó thành một lệnh thông qua pip3 install -r <(pip3 freeze) --upgrade Hiệu quả, <(pip3 freeze)là một đường dẫn ẩn danh, nhưng nó sẽ hoạt động như một đối tượng tệp
Sergiy Kolodyazhnyy

128

Phiên bản Windows sau khi tư vấn tài liệu tuyệt vời cho FORRob van der Woude

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

19
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

3
@RefaelAckermann Tôi nghi ngờ điều này sẽ chậm hơn bản gốc :) Để biết gói nào đã lỗi thời, trước tiên phải kiểm tra xem 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 như bước đầu tiên khi cập nhật và không tiến hành nếu không có phiên bản mới hơn. Tuy nhiên, trong phiên bản của bạn, pip sẽ kiểm tra các 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

2
@RefaelAckermann Kéo sợi pip nhanh hơn so với việc kiểm tra phiên bản của gói qua mạng, vì vậy số lượng kiểm tra cần được tối ưu hóa không phải là số lần quay. Của tôi làm cho n kiểm tra, của bạn làm cho kiểm tra n + m.
Piotr Dobrogost

2
+1 - Đó là 6.20.2019, tôi đang sử dụng Python 3.7.3 trên WIndows 10 và đây là cách tốt nhất để tôi cập nhật tất cả các gói cục bộ của mình.
MacItaly

1
Cần bỏ qua hai dòng đầu tiên của đầu ra : for /F "skip=2 delims= " %i in ('pip list --outdated') do pip install --upgrade %i. Nếu điều này được chạy từ một tệp bó, hãy đảm bảo sử dụng %%ithay vì %i. Cũng lưu ý rằng nó sạch hơn để cập nhật piptrước khi chạy lệnh này bằng cách sử dụng python -m pip install --upgrade pip.
Andy

127

Sử dụng đường ống !

$ pip install pipupgrade
$ pipupgrade --verbose --latest --yes

PipupTHER giúp bạn nâng cấp hệ thống, địa phương hoặc các gói từ một requirements.txttệp! Nó cũng chọn lọc nâng cấp các gói không phá vỡ sự thay đổi. PipupTHER cũng đảm bảo nâng cấp các gói có trong nhiều môi trường Python. Tương thích với Python2.7 +, Python3.4 + và pip9 +, pip10 +, pip18 +, pip19 +.

nhập mô tả hình ảnh ở đây

LƯU Ý: Tôi là tác giả của công cụ.


1
Phương pháp này có đầu ra sạch hơn nhiều so với câu trả lời của @ rbp
Gaia

7
Ý tưởng hay, nhưng nó bị kẹt Checking...mãi mãi khi tôi thử nó.
CGFoX

1
Chỉ cần cài đặt nó và cũng bị kẹt khi kiểm tra[0;93mChecking...[0m
Chris

1
@nathandrake quan tâm để mở một vấn đề trên trang vấn đề?
Achilles Gasper Rasquinha

2
Có lỗi trên Windows 10 và Python 3.7.5:ModuleNotFoundError: No module named 'ctypes.windll'
Qin Heyang

74

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:'

14
Trong một virtualenv, tôi làm như thế này: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 ở định dạng yêu cầu).
Jacktose

74

Tùy chọn này có vẻ đơn giản và dễ đọc hơn đối với tôi:

pip install -U `pip list --outdated | awk 'NR>2 {print $1}'`

Giải thích là đưa pip list --outdatedra một danh sách tất cả các gói lỗi thời ở định dạng này:

Package   Version Latest Type 
--------- ------- ------ -----
fonttools 3.31.0  3.32.0 wheel
urllib3   1.24    1.24.1 wheel
requests  2.20.0  2.20.1 wheel

Trong lệnh awk, NR>2bỏ qua hai bản ghi (dòng) {print $1}đầu tiên và chọn từ đầu tiên của mỗi dòng (như được đề xuất bởi SergioAraujo, tôi đã loại bỏ tail -n +3awkthực sự có thể xử lý bỏ qua các bản ghi).


Nếu một lần nâng cấp thất bại, không có sự nâng cấp nào xảy ra.
Boris

2
bạn có thể tránh đuôi awk 'NR>2 {print $1}'làm sạch đầu ra cho bạn
SergioAraujo

@SergioAraujo, điều này làm cho giải pháp trông cũng sạch hơn, cảm ơn vì tiền boa!
Marc

67

Một trong những lớp lót sau đây có thể chứng minh sự giúp đỡ:

(pip> 20.0)

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

Các phiên bản cũ hơn:

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

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

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

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

Dưới đây là một ví dụ hoạt động:

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

Phải thêm bộ lọc cho các dòng bắt đầu bằng 'Có thể' và 'Một số' vì rõ ràng pip gửi cảnh báo đến thiết bị xuất chuẩn :(
Chip Camden

OK, điều này là công bằng: Bạn có thể thêm bao nhiêu | sed 's/^<First characters of the error>.*//'là cần thiết. Cảm ơn bạn!
raratiru

14
Hoặc:pip list --outdated | cut -d ' ' -f 1 | xargs -n 1 pip install --upgrade
Jens

51

Giải pháp mạnh mẽ hơn

Đối với pip3, hãy sử dụng:

pip3 freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip3 install -U \1/p' |sh

Đối với pip, chỉ cần loại bỏ 3 giây như sau:

pip freeze --local |sed -rn 's/^([^=# \t\\][^ \t=]*)=.*/echo; echo Processing \1 ...; pip install -U \1/p' |sh

Sự lạ lùng của OSX

OSX, kể từ tháng 7 năm 2017, xuất xưởng một phiên bản sed rất cũ (một chục năm tuổi). Để có được các biểu thức chính quy mở rộng, sử dụng -E thay vì -r trong giải pháp trên.

Giải quyết các vấn đề với các giải pháp phổ biến

Giải pháp này được thiết kế và thử nghiệm tốt 1 , trong khi có những vấn đề với ngay cả những giải pháp phổ biến nhất.

  • Các vấn đề về tính di động do thay đổi tính năng dòng lệnh pip
  • Sự cố của xargs vì các lỗi quá trình con pip hoặc pip3 thông thường
  • Đăng nhập đông đúc từ đầu ra xargs thô
  • Dựa vào cầu nối Python-OS trong khi có khả năng nâng cấp nó 3

Lệnh trên sử dụng cú pháp pip đơn giản và di động nhất kết hợp với sed và sh để khắc phục hoàn toàn các vấn đề này. Chi tiết về hoạt động của sed có thể được xem xét kỹ lưỡng với phiên bản 2 đã nhận xét .


Chi tiết

[1] Đã thử nghiệm và sử dụng thường xuyên trong cụm Linux 4.8.16-200.fc24.x86_64 và thử nghiệm trên năm hương vị Linux / Unix khác. Nó cũng chạy trên Cygwin64 được cài đặt trên Windows 10. Cần thử nghiệm trên iOS.

[2] Để xem giải phẫu của lệnh rõ ràng hơn, đây là tương đương chính xác của lệnh pip3 ở trên với các nhận xét:

# match lines from pip's local package list output
# that meet the following three criteria and pass the
# package name to the replacement string in group 1.
# (a) Do not start with invalid characters
# (b) Follow the rule of no white space in the package names
# (c) Immediately follow the package name with an equal sign
sed="s/^([^=# \t\\][^ \t=]*)=.*"

# separate the output of package upgrades with a blank line
sed="$sed/echo"

# indicate what package is being processed
sed="$sed; echo Processing \1 ..."

# perform the upgrade using just the valid package name
sed="$sed; pip3 install -U \1"

# output the commands
sed="$sed/p"

# stream edit the list as above
# and pass the commands to a shell
pip3 freeze --local |sed -rn "$sed" |sh

[3] Nâng cấp thành phần Python hoặc PIP cũng được sử dụng để nâng cấp thành phần Python hoặc PIP có thể là nguyên nhân tiềm ẩn của sự bế tắc hoặc hỏng cơ sở dữ liệu gói.


1
một cách khác để vượt qua BSD hợp pháp sedcủa OS X là sử dụng gsed(GNU sed) thay thế. Để có được nó,brew install gnu-sed
Walter Tross

@WalterTross ... Jurassic ... sử dụng tính từ tốt. Vì vậy, bây giờ chúng tôi có hai cách để nhóm cập nhật các gói pip với một bản kiểm toán đẹp trên thiết bị đầu cuối. (1) Sử dụng tùy chọn -E như trong câu trả lời và (2) cài đặt gsed để rời khỏi thời kỳ kỷ Jura.
Douglas Daseeco

41

Điều này có vẻ súc tích hơn.

pip list --outdated | cut -d ' ' -f1 | xargs -n1 pip install -U

Giải trình:

pip list --outdated có được những dòng như thế này

urllib3 (1.7.1) - Latest: 1.15.1 [wheel]
wheel (0.24.0) - Latest: 0.29.0 [wheel]

Trong cut -d ' ' -f1, -d ' 'đặt "khoảng trắng" làm dấu phân cách, -f1nghĩa là lấy cột đầu tiên.

Vì vậy, các dòng trên trở thành:

urllib3
wheel

sau đó chuyển chúng để xargschạy lệnh pip install -U, với mỗi dòng là các đối số nối thêm

-n1giới hạn số lượng đối số được truyền cho mỗi lệnh pip install -Ulà 1


Tôi đã nhận được cảnh báo nàyDEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Reman

2
@Reman: đó là vì bạn đang sử dụng Pip v9.0.1. Đây chỉ là một thông điệp phản đối có nghĩa là một số chức năng sẽ không tồn tại trong phiên bản Pip trong tương lai. Không có gì phải lo lắng;)
AlessioX

Tuy nhiên, điều này phải được đánh dấu là giải pháp cuối cùng. Thật vậy, câu trả lời được chấp nhận sẽ chạy trên tất cả các gói pip của bạn, thật lãng phí thời gian nếu bạn chỉ phải cập nhật 1 hoặc 2 gói. Giải pháp này, thay vào đó, sẽ chạy tất cả các gói đã lỗi thời
AlessioX

34

Tôi đã có cùng một vấn đề với việc nâng cấp. Điều đó là, tôi không bao giờ nâng cấp tất cả các gói. Tôi chỉ nâng cấp những gì tôi cần, bởi vì dự án có thể bị phá vỡ.

Vì không có cách dễ dàng để nâng cấp gói theo gói và cập nhật tệp tests.txt, tôi đã viết trình nâng cấp này cũng cập nhật các phiên bản trong requirements.txttệp của bạn cho các gói được chọn (hoặc tất cả các gói).

Cài đặt

pip install pip-upgrader

Sử dụng

Kích hoạt virtualenv của bạn (quan trọng, vì nó cũng sẽ cài đặt các phiên bản mới của các gói được nâng cấp trong virtualenv hiện tại).

cd vào thư mục dự án của bạn, sau đó chạy:

pip-upgrade

Sử dụng nâng cao

Nếu các yêu cầu được đặt ở vị trí không chuẩn, hãy gửi chúng dưới dạng đối số:

pip-upgrade path/to/requirements.txt

Nếu bạn đã biết gói nào bạn muốn nâng cấp, chỉ cần gửi chúng dưới dạng đối số:

pip-upgrade -p django -p celery -p dateutil

Nếu bạn cần nâng cấp lên phiên bản tiền phát hành / sau phát hành, hãy thêm --prereleaseđối số vào lệnh của bạn.

Tiết lộ đầy đủ: Tôi đã viết gói này.


8
Đây là những gì pip nên làm theo mặc định.
Nỗi nhớ.io

đối mặt với công cụ của bạn, một số nhân vật thoát dường như không hoạt động chính xác trên máy tính windows của tôi nhưng điều đó không ổn
Luke

Chưa thực sự thử nghiệm nó trên windows, nhưng tôi sẽ cài đặt một máy ảo. Cảm ơn
Simion Agavriloaei

Nếu virtualenvkhông được bậtpip-upgrade --skip-virtualenv-check
Morse

2
Điều này cũng hoạt động với một thư mục yêu cầu có các yêu cầu chung, dev và prod. Đơn giản là tuyệt vời!
cwhisperer


27

Phiên bản một lót của câu trả lời của @ Ramana .

python -c 'import pip, subprocess; [subprocess.call("pip install -U " + d.project_name, shell=1) for d in pip.get_installed_distributions()]'

`


4
sub process.call ("sudo pip install ... trong trường hợp bạn cần quyền
Maximiliano Rios

4
@MaximilianoRios Xin đừng sudo pip install, sử dụng một env ảo , thay vào đó.
Bengt

22

khi sử dụng virtualenv và nếu bạn chỉ muốn nâng cấp các gói được thêm vào virtualenv của mình, bạn có thể muốn làm:

pip install `pip freeze -l | cut --fields=1 -d = -` --upgrade


18

Giải pháp Windows Powershell

pip freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}

pip list --outdated | %{$_.split('==')[0]} | %{pip install --upgrade $_}?
Foad

2
Có lẽ pip list --outdated --format freeze | %{$_.split('==')[0]} | %{pip install --upgrade $_}sẽ thích hợp hơn.
Brainplot

16

sử dụng gói cập nhật awk: pip install -U $(pip freeze | awk -F'[=]' '{print $1}')

cửa sổ cập nhật quyền hạn foreach($p in $(pip freeze)){ pip install -U $p.Split("=")[0]}


pip đóng băng | awk -F '[=]' '{in $ 1}' | cài đặt xargs pip -U
JohnDHH

Và đối với python 3 ... cài đặt pip3 -U $ (đóng băng pip3 | awk -F '[=]' '{print $ 1}')
Jimmy MG Lim

12

Bạn có thể thử điều này:

for i in ` pip list|awk -F ' ' '{print $1}'`;do pip install --upgrade $i;done

đây là cách sạch nhất, dễ đọc nhất để cập nhật các gói pip với số lượng ngắn nhất. tuyệt quá.
Mark Shust tại M.academy

12

Lòng đỏ khá tuyệt vời làm cho điều này dễ dàng.

pip install yolk3k # don't install `yolk`, see https://github.com/cakebread/yolk/issues/35
yolk --upgrade

Để biết thêm thông tin về lòng đỏ: https://pypi.python.org/pypi/yolk/0.4.3

Nó có thể làm rất nhiều thứ có thể bạn sẽ thấy hữu ích.


3
Câu trả lời của bạn đã được thay đổi từ yolkthành yolk3k, câu trả lời ban đầu của bạn chắc chắn có vấn đề với python3.
AXO

10

Câu trả lời của @ Ramana làm việc tốt nhất cho tôi, trong số những người ở đây, nhưng tôi đã phải thêm một vài lưu ý:

import pip
for dist in pip.get_installed_distributions():
    if 'site-packages' in dist.location:
        try:
            pip.call_subprocess(['pip', 'install', '-U', dist.key])
        except Exception, exc:
            print exc

Các site-packageskiểm tra không bao gồm các gói phát triển của tôi, bởi vì họ không nằm trong hệ thống thư mục trang web gói. Việc thử - ngoại trừ đơn giản là bỏ qua các gói đã bị xóa khỏi PyPI.

@endolith: Tôi cũng hy vọng dễ dàng pip.install(dist.key, upgrade=True), nhưng có vẻ như pip không được sử dụng bởi bất cứ thứ gì ngoại trừ dòng lệnh (tài liệu không đề cập đến API nội bộ và các nhà phát triển pip không sử dụng tài liệu).


Trên Ubuntu (và các dẫn xuất Debian khác), piprõ ràng đặt các gói trong /usr/local/lib/python2.7/dist-packageshoặc tương tự. Bạn có thể sử dụng '/ usr / local / lib /' thay vì 'gói trang web' trong ifcâu lệnh trong trường hợp này.
drevicko

10

Công pip_upgrade_outdatedviệc này Theo tài liệu của nó :

usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD]
                            [--serial | --parallel] [--dry_run] [--verbose]
                            [--version]

Upgrade outdated python packages with pip.

optional arguments:
  -h, --help         show this help message and exit
  -3                 use pip3
  -2                 use pip2
  --pip_cmd PIP_CMD  use PIP_CMD (default pip)
  --serial, -s       upgrade in serial (default)
  --parallel, -p     upgrade in parallel
  --dry_run, -n      get list, but don't upgrade
  --verbose, -v      may be specified multiple times
  --version          show program's version number and exit

Bước 1:

pip install pip-upgrade-outdated

Bước 2:

pip_upgrade_outdated

1
Bước 1: Pip cài đặt pip-nâng cấp-lỗi thời Bước 2: Pip-nâng cấp-lỗi thời ... đã hoàn thành
shao.lo

9

Gửi qua một yêu cầu kéo đến dân gian pip ; Trong khi đó, sử dụng giải pháp thư viện pip này tôi đã viết:

from pip import get_installed_distributions
from pip.commands import install

install_cmd = install.InstallCommand()

options, args = install_cmd.parse_args([package.project_name
                                        for package in
                                        get_installed_distributions()])

options.upgrade = True
install_cmd.run(options, args)  # Chuck this in a try/except and print as wanted

Phiên bản có xử lý lỗi (theo nhận xét): gist.github.com/SamuelMarks/7885f2e8e5f0562b1063
Samuel Marks

9

Điều này dường như làm việc cho tôi ...

pip install -U $(pip list --outdated|awk '{printf $1" "}')

Tôi đã sử dụng printfmột khoảng trắng sau đó để phân tách đúng tên các gói.


7

Đây là giải pháp PowerShell cho Python 3:

pip3 list --outdated --format=legacy | ForEach { pip3 install -U $_.split(" ")[0] }

Và đối với Python 2:

pip2 list --outdated --format=legacy | ForEach { pip2 install -U $_.split(" ")[0] }

Điều này nâng cấp từng gói một. Vậy một

pip3 check
pip2 check

sau đó nên chắc chắn rằng không có sự phụ thuộc nào bị phá vỡ.



7

Ngắn nhất và dễ nhất trên Windows.

pip freeze > requirements.txt && pip install --upgrade -r requirements.txt && rm requirements.txt

@Enkouyami trên windows 7 Lệnh này không hoạt động nếu không có -r. -r phải loại trừ đường dẫn đến tệp yêu cầu.
Chockomonkey

6

Kịch bản của tôi:

pip list --outdated --format=legacy | cut -d ' ' -f1 | xargs -n1 pip install --upgrade

6

Điều này có hiệu quả hơn không?

pip3 list -o | grep -v -i warning | cut -f1 -d' ' | tr " " "\n" | awk '{if(NR>=3)print}' | cut -d' ' -f1 | xargs -n1 pip3 install -U 
  1. pip list -o liệt kê các gói lỗi thời;
  2. grep -v -i warningđảo ngược warningđể tránh lỗi khi cập nhật
  3. cut -f1 -d1' ' trả về từ đầu tiên - tên của gói lỗi thời;
  4. tr "\n|\r" " "chuyển đổi kết quả đa dòng từ cutthành một danh sách đơn dòng, được phân tách bằng dấu cách;
  5. awk '{if(NR>=3)print}' bỏ qua các dòng tiêu đề
  6. cut -d' ' -f1 lấy cột đầu tiên
  7. xargs -n1 pip install -U lấy 1 đối số từ đường ống bên trái của nó và chuyển nó tới lệnh để nâng cấp danh sách các gói.

Đây là đầu ra của tôi: kerberos iwlib PyYAML Could pygpgme Could Could Could ...Lưu ý tất cả các "Có thể". Những xuất phát từ đầu ra của pip list -o"Không thể tìm thấy bất kỳ tải xuống nào đáp ứng yêu cầu <gói>"
DrStrangepork

Bạn có thể dán đầu ra của pip list -o?
Alex V

Nhận xét không định dạng tốt điều này, nhưng đây là đoạn trích (kết thúc dòng được đánh dấu bằng ';'):# pip list -o; urwid (Current: 1.1.1 Latest: 1.3.0); Could not find any downloads that satisfy the requirement python-default-encoding; pycups (Current: 1.9.63 Latest: 1.9.68); Could not find any downloads that satisfy the requirement policycoreutils-default-encoding; Could not find any downloads that satisfy the requirement sepolicy;
DrStrangepork

thay vì lọc ra tất cả các dòng không nên sử dụng, tôi khuyên bạn nên lọc các dòng có bản cập nhật : pip install -U $(pip list -o | grep -i current | cut -f1 -d' ' | tr "\n|\r" " ") . Nếu không, bạn có thể dễ dàng bỏ lỡ một dòng bạn không muốn và nhận được kết quả mà DrStrangeprk đã đề cập.
kháng sinh

Tôi thực sự khuyên bạn nên sử dụng xargsthay thế. pip list -o | awk '/Current:/ {print $1}' | xargs -rp -- pip install -UCác -rĐảm bảo lá cờ đó pip install -Usẽ không thể chạy nếu không có gói lỗi thời. Các -pcờ nhắc nhở người dùng xác nhận trước khi thực hiện bất kỳ lệnh. Bạn có thể thêm -n1cờ để nhắc nó trước khi cài đặt từng gói riêng biệt.
Sáu

6

một dòng trong powershell 5.1 với quyền adm, python 3.6.5 và pip ver 10.0.1:

pip list -o --format json | ConvertFrom-Json | foreach {pip install $_.name -U --no-warn-script-location}

nó hoạt động trơn tru nếu không có gói bị hỏng hoặc bánh xe đặc biệt trong danh sách ...

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.