pip จะติดตั้งแพ็คเกจด้วยช่วงต่ำสุดและสูงสุดได้อย่างไร?


233

ฉันสงสัยว่ามีวิธีใดที่จะบอก pip ได้โดยเฉพาะในไฟล์ข้อกำหนดเพื่อติดตั้งแพคเกจที่มีทั้งเวอร์ชันขั้นต่ำ ( pip install package>=0.2) และเวอร์ชันสูงสุดซึ่งไม่ควรติดตั้ง (ทฤษฎี API pip install package<0.3)

ฉันถามเพราะฉันใช้ห้องสมุดบุคคลที่สามซึ่งอยู่ในระหว่างการพัฒนา ฉันต้องการไฟล์ pip ข้อกำหนดของฉันเพื่อระบุว่าควรติดตั้งสาขาย่อยรุ่นล่าสุดของ 0.5.x เสมอ แต่ฉันไม่ต้องการให้ pip พยายามติดตั้งรุ่นหลักรุ่นใหม่ใด ๆ (เช่น 0.6.x) API นั้นแตกต่างกัน สิ่งนี้สำคัญเนื่องจากแม้ว่าสาขา 0.6.x จะพร้อมใช้งาน devs ยังคงปล่อยแพตช์และแก้ไขข้อบกพร่องไปยังสาขา 0.5.x ดังนั้นฉันจึงไม่ต้องการใช้package==0.5.9สายคงที่ในไฟล์ข้อกำหนดของฉัน

มีวิธีใดที่จะทำเช่นนั้น?

คำตอบ:


301

คุณทำได้:

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

และpipจะค้นหาการจับคู่ที่ดีที่สุดโดยสมมติว่าเวอร์ชั่นอย่างน้อย 0.2 และน้อยกว่า 0.3

นอกจากนี้ยังนำไป pip ไฟล์ความต้องการ ดูรายละเอียดเกี่ยวกับ specifiers รุ่นในPEP 440


ลิ้งค์ เอกสารอย่างเป็นทางการที่นี่
beatgammit

45
สำหรับบันทึกฉันคิดว่า"package>=0.2,<=0.3"ไม่สมเหตุสมผล: เมื่อไหร่ที่คุณจะโอเคกับทั้ง 0.2 และ 0.3.0 แต่ไม่ใช่กับการแก้ไขข้อผิดพลาดของ 0.3? ฉันคิดว่า"package>=0.2,<0.3"เป็นตัวอย่างที่ดีกว่ามากเพราะมันสะท้อนให้เห็นถึงกรณีทั่วไปของการพูดว่า: "โปรดให้ฉันรุ่นล่าสุดแก้ไขข้อผิดพลาดของรุ่นรองในปัจจุบัน แต่ไม่อัพเกรดฉันเป็นรุ่นรองถัดไปโดยอัตโนมัติเพราะฉันต้องการจะทำ เพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลงการทำงานที่ส่งผลกระทบต่อฉัน "
Henrik Heimbuerger

หากคุณชอบคำตอบนี้คุณจะรัก Mortiz คำตอบด้านล่าง! ให้แน่ใจว่าได้ตรวจสอบออก~=0.2เป็น (imho) ทางออกที่ดีกว่านี้
แบรดราก

1
@BramRoot มันชัดเจนจริงๆว่า~=0.2.1จะทำอย่างไรเช่น ความชัดเจนในฐานะ>=0.2,<0.3เป็นสิ่งที่ดีเพราะมันชัดเจนว่าเกิดอะไรขึ้น
คิวเมนตัส

@Acumenus ผู้ที่เข้าใจคุณสมบัติของรูปแบบความต้องการและวิธีการทำงานของการกำหนดเวอร์ชันจะไม่เขียนลง~=0.2.1ในไฟล์ข้อกำหนด นั่นเป็นข้อผิดพลาดของผู้ใช้ไม่ใช่ข้อเสียของ~=คำนำหน้า
แบรดรูต

86

คุณยังสามารถใช้:

pip install package==0.5.*

ซึ่งมีความสอดคล้องและอ่านง่ายกว่า


12
นี่เป็นวิธีที่ดีกว่าในการจัดการrequirements.txtIMO การใช้package==1.*แทนการpackage>=1.2ป้องกัน pip จากการติดตั้งรุ่นหลัก 2+ สำหรับแพ็คเกจซึ่งเป็นที่ต้องการเนื่องจากการเปลี่ยนแปลงรุ่นใหญ่มักจะเข้ากันไม่ได้
Michael Hays

10
หมายเหตุสิ่งนี้ไม่ได้อัพเกรดแพ็คเกจที่มีอยู่ เช่นถ้าคุณติดตั้ง 0.5.1 แต่ 0.5.2 เป็นรุ่นล่าสุดและคุณเรียกใช้การติดตั้ง 0.5. * มันจะพูดว่า "พอใจแล้ว" และทำให้คุณมี 0.5.1 การเพิ่ม - อัปเกรดแก้ปัญหาได้
scipilot

71

วิธีที่สง่างามที่จะใช้~=ประกอบการเปิดตัวเข้ากันได้ตามPEP 440 ในกรณีของคุณสิ่งนี้จะเป็น:

package~=0.5.0

ตัวอย่างเช่นหากมีรุ่นต่อไปนี้อยู่ก็จะเลือก0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

สำหรับการชี้แจงแต่ละคู่มีค่าเท่ากัน:

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

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

คุณจะใช้มันสำหรับเวอร์ชันที่ถูกตัดทอนอย่างไร เช่นหากมี2.2และอนาคตที่วางแผนไว้2.2.1จะ~=2.2.*จับคู่2.2แม้จะไม่มีหมายเลขตติยภูมิ?
Kamermans ของไมค์ 'Pomax'

1
@ Mike'Pomax'Kamermans คุณควรใช้~=2.2.0ในกรณีนี้ ( *โอเปอเรเตอร์จะไม่ทำงานหากคุณใช้งาน~=) 2.2และ2.2.0(และ2.2.0.0และอื่น ๆ ) ได้รับการจัดการภายในเช่นเดียวกับเมื่อติดตั้งแพ็คเกจ
ik1ne

~=1.2.3มันยังไม่ชัดเจนมากวิธีการทำงานนี้สำหรับหมายเลขรุ่นซ้อนกันเช่น มีความชัดเจนและชัดเจนมากขึ้นในการใช้ฟอร์ม multi-clause แทน
คิวเมนตัส

2
@MitchMcMabers ใช้งานได้เฉพาะคุณสมบัติที่คุณต้องการให้ปรากฏในรุ่นแรกของรุ่นหลักนั้นซึ่งไม่เป็นความจริงโดยทั่วไป หากคุณกำลังพึ่งพาบางสิ่งที่เพิ่มเข้ามาใน v1.2.0 ตัวอย่างเช่น== 1.*จะยอมรับ v1.1.0 อย่างไม่เหมาะสม ตัวดำเนินการ~=(หรือ>=บวก<ถ้าคุณพบว่าอ่านยาก) จะดีกว่าเพราะเป็นการส่งเสริมให้มีความเฉพาะเจาะจงอย่างถูกต้อง
Maxpm

1
@ Maxmac เป็นจุดที่ดี ดังนั้น== 1.*จะล้มเหลวและไม่ทำอะไรเลยหากเราต้องการคุณสมบัติรุ่น 1.2 แต่ผู้ใช้ติดตั้ง 1.1 แล้ว ข้อเสนอของคุณ~= 1.2เหมือนกับการพูด>= 1.2, < 2.0(หรือ>= 1.2, == 1.*) ใช่แล้วคุณ~=เป็นผู้ดำเนินการที่ดีที่สุดเพราะช่วยให้คุณกำหนดเป้าหมายเวอร์ชันการพัฒนาที่คุณใช้ของไลบรารีขณะที่อนุญาตรุ่นที่ใหม่กว่าภายในเวอร์ชันหลักเดียวกัน ขอบคุณสำหรับคำชี้แจง!
Mitch McMabers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.