Làm thế nào để pip cài đặt một gói với phạm vi phiên bản tối thiểu và tối đa?


233

Tôi tự hỏi liệu có cách nào để nói với pip, cụ thể là trong tệp yêu cầu, để cài đặt gói có cả phiên bản tối thiểu ( pip install package>=0.2) và phiên bản tối đa không bao giờ được cài đặt (lý thuyết api pip install package<0.3:).

Tôi hỏi bởi vì tôi đang sử dụng một thư viện bên thứ ba đang phát triển tích cực. Tôi muốn tệp yêu cầu pip của tôi chỉ định rằng nó sẽ luôn cài đặt bản phát hành nhỏ gần đây nhất của nhánh 0.5.x, nhưng tôi không muốn pip cố gắng cài đặt bất kỳ phiên bản chính mới hơn nào (như 0.6.x) API thì khác. Điều này rất quan trọng vì mặc dù nhánh 0.6.x có sẵn, các nhà phát triển vẫn phát hành các bản vá và sửa lỗi cho nhánh 0,5.x, vì vậy tôi không muốn sử dụng một package==0.5.9dòng tĩnh trong tệp yêu cầu của mình.

Có cách nào để làm điều đó?

Câu trả lời:


301

Bạn có thể làm:

$ pip install "package>=0.2,<0.3"

pipsẽ tìm kiếm kết quả phù hợp nhất, giả sử phiên bản ít nhất là 0,2 và dưới 0,3.

Điều này cũng áp dụng cho các tập tin yêu cầu pip . Xem chi tiết đầy đủ về các chỉ định phiên bản trong PEP 440 .


Liên kết chết. Tài liệu chính thức tại đây .
beatgammit

45
Đối với hồ sơ, tôi nghĩ "package>=0.2,<=0.3"không có nhiều ý nghĩa: khi nào bạn sẽ ổn với cả 0,2 và 0,3, nhưng không phải với bất kỳ bản phát hành lỗi nào của 0,3? Tôi nghĩ "package>=0.2,<0.3"là một ví dụ tốt hơn nhiều, bởi vì nó phản ánh trường hợp phổ biến của câu nói: "vui lòng cho tôi bản phát hành lỗi mới nhất của phiên bản nhỏ hiện tại, nhưng đừng tự động nâng cấp tôi lên phiên bản nhỏ tiếp theo, vì tôi muốn làm điều đó rõ ràng, đảm bảo rằng không có thay đổi chức năng nào ảnh hưởng đến tôi. "
Henrik Heimbuerger

Nếu bạn thích câu trả lời này, bạn sẽ thích câu trả lời của Mortiz ngay bên dưới! Hãy chắc chắn kiểm tra xem nó ~=0.2là (imho) một giải pháp tốt hơn thế này.
Brad Root

1
@BradRoot Nó thực sự không rõ ràng những gì ~=0.2.1sẽ làm, ví dụ. >=0.2,<0.3Rõ ràng như trong là một điều tốt bởi vì nó thực sự rõ ràng những gì đang xảy ra.
Acumenus

@Acumenus ai đó hiểu các thuộc tính của định dạng yêu cầu và cách hoạt động của phiên bản sẽ không ghi ~=0.2.1trong tệp yêu cầu. Đó là lỗi người dùng, không phải là nhược điểm của ~=tiền tố.
Brad Root

86

bạn cũng có thể dùng:

pip install package==0.5.*

đó là phù hợp hơn và dễ đọc.


12
Đây là một cách tốt hơn để quản lý requirements.txtIMO. Sử dụng package==1.*thay vì package>=1.2ngăn pip cài đặt phiên bản chính 2+ cho gói, điều này là mong muốn vì các thay đổi phiên bản chính thường không tương thích ngược.
Michael Hays

10
Lưu ý, Điều này không nâng cấp một gói hiện có. ví dụ: nếu bạn đã cài đặt 0.5.1, nhưng 0.5.2 là mới nhất và bạn chạy cài đặt 0.5. * nó sẽ nói "đã hài lòng" và để lại cho bạn 0,5.1. Thêm - nâng cấp giải quyết nó.
scipilot

71

Một phương pháp tao nhã sẽ là sử dụng ~=toán tử phát hành tương thích theo PEP 440 . Trong trường hợp của bạn, số tiền này sẽ là:

package~=0.5.0

Ví dụ, nếu các phiên bản sau tồn tại, nó sẽ chọn 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Để làm rõ, mỗi cặp tương đương:

~= 0.5.0
>= 0.5.0, == 0.5.*

~= 0.5
>= 0.5, == 0.*

Làm thế nào bạn sẽ sử dụng điều này cho các phiên bản rút gọn? Ví dụ, nếu có một 2.2tương lai có kế hoạch 2.2.1, sẽ ~=2.2.*phù hợp 2.2mặc dù không có số thứ ba?
Mike 'Pomax' Kamermans

1
@ Mike'Pomax'Kamermans Bạn nên sử dụng ~=2.2.0trong trường hợp đó ( *toán tử sẽ không hoạt động nếu bạn đang sử dụng ~=). 2.22.2.0(và 2.2.0.0, v.v.) được xử lý nội bộ giống như khi cài đặt các gói.
ik1ne

Không rõ làm thế nào điều này hoạt động để đánh số phiên bản lồng nhau, ví dụ ~=1.2.3. Thay vào đó, rõ ràng và rõ ràng hơn nhiều khi sử dụng mẫu đa mệnh đề.
Acumenus

2
@MitchMcMabers Chỉ hoạt động nếu các tính năng bạn muốn có mặt trong phiên bản đầu tiên của phiên bản chính đó, nói chung không đúng. Ví dụ, nếu bạn đang dựa vào thứ gì đó đã được thêm vào v1.2.0, == 1.*sẽ chấp nhận không đúng v1.1.0. Các ~=(hoặc >=cộng <nếu bạn thấy rằng để đọc cứng) điều hành là tốt hơn bởi vì nó khuyến khích là chính xác cụ thể.
Tối đa

1
@Maxpm Đó là một điểm tốt. Vì vậy, == 1.*sẽ thất bại và không làm gì nếu chúng ta cần một tính năng phiên bản 1.2 nhưng người dùng đã cài đặt 1.1. Đề xuất của bạn ~= 1.2giống như nói >= 1.2, < 2.0(hoặc >= 1.2, == 1.*). Vì vậy, đúng, bạn đúng, ~=là nhà điều hành tốt nhất vì nó cho phép bạn nhắm mục tiêu phiên bản phát triển bạn đã sử dụng của thư viện, đồng thời cho phép các phiên bản mới hơn trong cùng phiên bản chính. Cảm ơn đã làm rõ!
Mitch McMabers
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.