Nâng cấp gói python từ tệp tests.txt bằng lệnh pip


111

Làm cách nào để nâng cấp tất cả các gói python của tôi từ tệp tin request.txt bằng lệnh pip?

đã thử với lệnh dưới đây

$ pip install --upgrade -r requirements.txt

Vì các gói python được gắn với số phiên bản ( Django==1.5.1) mà chúng dường như không nâng cấp. Có cách tiếp cận nào tốt hơn so với việc chỉnh sửa thủ công tệp tin request.txt không?

BIÊN TẬP

Như Andy đã đề cập trong các gói câu trả lời của anh ấy được ghim vào một phiên bản cụ thể, do đó không thể nâng cấp gói thông qua lệnh pip.

Tuy nhiên, chúng ta có thể đạt được điều này bằng pip-toolscách sử dụng lệnh sau.

$ pip-review --auto

điều này sẽ tự động nâng cấp tất cả các gói từ pip-toolstệp tin request.txt (đảm bảo cài đặt bằng lệnh pip install).


7
Pip-tools đang hoạt động tốt - cú pháp được cập nhật là pip-compile -U requirements.txt.
erikreed

Câu trả lời:


40

Không. Tệp yêu cầu của bạn đã được ghim vào các phiên bản cụ thể. Nếu yêu cầu của bạn được đặt thành phiên bản đó, bạn không nên cố nâng cấp lên ngoài các phiên bản đó. Nếu bạn cần nâng cấp, thì bạn cần chuyển sang các phiên bản đã bỏ ghim trong tệp yêu cầu của mình.

Thí dụ:

lxml>=2.2.0

Điều này sẽ nâng cấp lxml lên bất kỳ phiên bản nào mới hơn 2.2.0

lxml>=2.2.0,<2.3.0

Điều này sẽ nâng cấp lxml lên phiên bản mới nhất giữa 2.2.0 và 2.3.0.


2
Tôi thấy hữu ích khi làm những điều sau đây. 1. Đã xóa venv 2. Tạo một cái mới có cùng tên (cách làm sạch tất cả các gói pip) 3. Thay thế tất cả == thành> = trong
request.txt

sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt sẽ thay thế tất cả ==bằng>=
philshem

80

bạn co thể thử:

pip install --upgrade --force-reinstall -r requirements.txt

Bạn cũng có thể bỏ qua gói đã cài đặt và cài đặt gói mới:

pip install --ignore-installed -r requirements.txt

2
với tùy chọn đó, nó dường như cài đặt lại cùng một phiên bản. Như Andy đã đề cập trong câu trả lời ở trên, các gói được ghim vào phiên bản cụ thể.
abhiomkar

@abhiomkar bạn rigth đang tôi nghĩ bạn muốn tái cài đặt phiên bản tương tự (có thể thêm sửa chữa backport)
Freelancer

1
Lệnh thứ hai là những gì tôi đang tìm kiếm. Lưu ý rằng -I--ignore-installedlà các cờ giống nhau và tất nhiên nó không hợp lệ để có một ,trong đó. Bằng cách này, sẽ không xảy ra hạ cấp trong khi cài đặt và sau khi cài đặt xong các yêu cầu, người ta có thể nâng cấp các gói đã cài đặt bằng cách sử dụng pip-review --auto.
AXO

79

Tôi đã trả lời câu hỏi này ở đây . Đây là giải pháp của tôi:

Bởi vì không có cách nào dễ dàng để nâng cấp từng gói và cập nhật tệp tin request.txt, nên tôi đã viết gói nâng cấp pip 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 đã 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 gói 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 mình muốn nâng cấp gói nào, 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 trước / sau khi 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.


5
Tuyệt quá! Thật ngạc nhiên khi một chức năng như vậy là không có mặt trực tiếp trong pip
Jacopofar

5
Thanh lịch! Rất vui vì tôi đã cuộn xuống cái này: P
PulseJet

3
Tôi vừa mới sử dụng cái này, và đây là cái tốt nhất kể từ f-string.
Pierre.Sassoulas

1
Công cụ tuyệt vời. Cảm ơn bạn.
mszaro

Công cụ rất hữu ích! Tôi cũng tìm thấy một gói gọi là pur rằng nâng cấp các phiên bản đó cũng được ghim
Gal Avineri

4

Tôi khuyên bạn nên đóng băng tất cả các phụ thuộc của bạn để có các bản dựngthể dự đoán được .

Khi làm điều đó, bạn có thể cập nhật tất cả các phụ thuộc cùng một lúc như sau:

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

Sau khi thực hiện ở trên, kiểm tra dự án của bạn với các thiết lập mới các gói và cuối cùng cam kết các requirements.txttập tin vào kho.


3

Tôi vừa phải làm điều tương tự ... sử dụng một lớp lót nhỏ này để thực hiện công việc:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

cái nào:

  • packages=$(cat requirements.txt | sed 's/==.*//g') tạo một danh sách các tên gói hiện tại trong tệp tests.txt (xoá phiên bản).
  • echo $packages | xargs pip3 install -U sau đó chuyển tất cả các gói dưới dạng đối số tới pip3 để nâng cấp.
  • freeze=$(pip3 freeze); Nhận tất cả các phiên bản gói hiện tại ở định dạng được yêu cầu cho request.txt
  • for p in $(echo $packages) sau đó lặp qua các tên gói
    • echo $freeze | grep -E "^${p}==" >> requirements.new lấy dòng phiên bản gói từ đầu ra đóng băng pip phù hợp với gói và ghi vào các yêu cầu mới.txt

Điều này có lợi ích bổ sung là duy trì thứ tự của các tệp tin gốc. :)

Hi vọng điêu nay co ich!


2

Vì tôi không thể làm điều đó bằng cách sử dụng bash, tôi đã viết một mô-đun python để tạo tệp yêu cầu mới không có phiên bản và sử dụng nó:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

Sau đó cài đặt libs từ tệp mới pip install -U -r requirements-prod-no-version.pip

Cuối cùng đóng băng các phiên bản vào tệp gốc pip freeze > requirements-prod.pip


2

Một giải pháp khác là sử dụng gói yêu cầu nâng cấp

pip install upgrade-requirements

Và sau đó chạy:

upgrade-requirements

Nó sẽ nâng cấp tất cả các gói không phải ở phiên bản mới nhất của chúng, và cũng tạo ra một tệp tin request.txt được cập nhật ở cuối.


0
  • 1) Để nâng cấp các tệp đã cài đặt pip từ reqs.txt, hãy thêm dấu > = thay cho dấu ==, điều này sẽ thông báo cho pip cài đặt lib lớn hơn hoặc bằng phiên bản bạn đang yêu cầu, tại đây bằng cách cài đặt phiên bản mới nhất của thư viện được yêu cầu

    1.a) ** Câu trả lời của tôi cho chủ đề ** Bằng cách thêm py -m pip install -r reqs.txt vào khởi động lại hàng ngày ... hoặc thứ gì đó tự nhiên, bạn có thể cập nhật các libs đã cài đặt của mình. Được tổng hợp bởi Andy Perfectly

    - Lý do của tôi Để vào chuỗi này là để tìm thông tin về cách cập nhật pip ảo env base (thường là 10.0.03 đối với tôi ??)

với hy vọng thỏa mãn một vấn đề mà tôi đã có thể tìm ra một trong hai giải pháp

A. tạo venv || B. Cài đặt lib bắt buộc

Cảm ơn Andy, tôi đã thỏa mãn nhu cầu B

Bằng cách thêm pip > = phiên bản được yêu cầu trong reqs.txt

khi tạo ra môi trường ảo mới || tái tạo Venv trước đó

  1. py -m venv devenv

để thiết lập env dev mới

  1. devenv\scripts\activate.bat

để kích hoạt dev env

  1. python -m pip install -r requirenments.txt

để cài đặt lib cơ sở

sản lượng nấm men

Thu thập pip > = 20.0.2 (từ -r preferrenments.txt (dòng 1)) Sử dụng bộ nhớ đệm> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3- không-bất kỳ.whl

Đã tìm thấy cài đặt hiện có: pip 10.0.1

Gỡ cài đặt pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Xin lỗi vì Brain Dump, hy vọng điều này sẽ giúp ích cho ai đó :)

🤳 Austin 👨‍🎤🚀🥊


0

Câu trả lời thứ hai là hữu ích nhất nhưng điều tôi muốn làm là khóa một số gói trong khi có những gói khác ở phiên bản mới nhất (ví dụ: youtube-dl).

Một ví dụ requirements.txtsẽ như thế này (~ có nghĩa là tương thích):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Sau đó, trong terminal, sử dụng lệnh pip install --upgrade -r requirements.txt

Điều này đảm bảo rằng Pillow sẽ ở mức 6.2.2, các yêu cầu sẽ được nâng cấp lên 2.22.x mới nhất (nếu có) và phiên bản youtube-dl mới nhất sẽ được cài đặt nếu chưa có.


0

Tôi đoán giải pháp đơn giản nhất là tạo tệp tin request.txt với:

pip freeze | sed 's/==/>=/' > requirements.txt

-1

Nếu bạn cài đặt bất kỳ thứ gì trong dự án django của mình và sau khi cài đặt, bạn muốn cập nhật tệp yêu cầu của mình, lệnh này có thể cập nhật cho bạn tệp tin pipet. Pip đóng băng> yêu cầu.txt

nếu tệp yêu cầu của bạn không tồn tại trong dự án của bạn, bạn có thể sử dụng lệnh này để thực hiện đóng băng tệp pip request.txt mới> request.txt


đây là một ý tưởng tồi vì nó cũng sẽ thêm các yêu cầu của tất cả các yêu cầu của bạn, dẫn đến một tệp yêu cầu lớn không cần thiết. Sau đó, nếu bạn quyết định cập nhật một phần phụ thuộc duy nhất, bạn có thể gặp phải xung đột phiên bản, trừ khi bạn biết yêu cầu nào khác đã được thêm vào tệp yêu cầu của mình vì gói đó.
bạo loạn

-10

Tôi chỉnh sửa tệp tests.txt như bên dưới và chạy $ sh ./requirements.txt

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;

3
Đây là ví dụ lý tưởng cho mô hình chống. Có gì sai ở đây: 1) Yêu cầu.txt là một tệp .txt, nhưng bạn đã làm cho nó thực thi được 2). Có một lệnh pip install -r request.txt đơn giản. Vì vậy, bạn chỉ có thể sử dụng tệp tin request.txt để liệt kê các phụ thuộc dự án của mình. 3) Bạn không sử dụng phiên bản của gói. 4) Không phải là một mẫu phổ biến, các nhà phát triển khác không biết gì về cách sử dụng nó. 5) Khó sử dụng với đường ống CI / CD. Vui lòng không sử dụng ví dụ này
Fannigurt
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.