เมื่อใดควรใช้ไฟล์ข้อกำหนด pip เทียบกับ install_requires ใน setup.py


94

ฉันใช้ pip กับ Virtualenv เพื่อทำแพ็กเกจและติดตั้งไลบรารี Python บางตัว

ฉันคิดว่าสิ่งที่ฉันกำลังทำนั้นเป็นสถานการณ์ธรรมดา ๆ ฉันเป็นผู้ดูแลในหลาย ๆ ไลบรารีซึ่งฉันสามารถระบุการอ้างอิงได้อย่างชัดเจน ไลบรารีบางส่วนของฉันขึ้นอยู่กับไลบรารีของบุคคลที่สามที่มีการอ้างอิงแบบสกรรมกริยาซึ่งฉันไม่สามารถควบคุมได้

สิ่งที่ฉันพยายามบรรลุคือเพื่อให้pip installหนึ่งในไลบรารีของฉันดาวน์โหลด / ติดตั้งการอ้างอิงต้นน้ำทั้งหมด สิ่งที่ผมกำลังดิ้นรนกับในเอกสาร pip คือหาก / วิธีไฟล์ต้องการinstall_requiresสามารถทำเช่นนี้ได้ด้วยตัวเองหรือถ้าพวกเขากำลังจริงๆเพียงแค่อาหารเสริมเพื่อใช้

ฉันจะใช้install_requiresในไลบรารีทั้งหมดของฉันเพื่อระบุการอ้างอิงและช่วงเวอร์ชันจากนั้นใช้เฉพาะไฟล์ข้อกำหนดเพื่อแก้ไขข้อขัดแย้งและ / หรือตรึงไว้สำหรับบิลด์การผลิตหรือไม่

ลองแกล้งทำเป็นว่าฉันอาศัยอยู่ในโลกแห่งจินตนาการ (ฉันรู้ฉันรู้) และการพึ่งพาต้นน้ำของฉันนั้นตรงไปตรงมาและรับประกันว่าจะไม่ขัดแย้งหรือทำลายความเข้ากันได้แบบย้อนหลัง ฉันจะถูกบังคับให้ใช้ไฟล์ข้อกำหนด pip เลยหรือเพียงแค่ปล่อยให้ pip / setuptools / แจกจ่ายติดตั้งทุกอย่างตามinstall_requires?

มีคำถามที่คล้ายกันมากมายที่นี่ แต่ฉันไม่พบคำถามที่เป็นพื้นฐานเท่ากับเวลาที่ควรใช้อย่างใดอย่างหนึ่งหรือใช้ทั้งสองอย่างร่วมกันอย่างกลมกลืน


3
นี่เป็นบทความที่ดีมากที่อธิบายถึงความสัมพันธ์ของทั้งสองและวิธีการรวมเข้าด้วยกัน
Björn Pollex

คำตอบ:


68

ปรัชญาของฉันคือinstall_requiresควรระบุสิ่งที่คุณต้องการเป็นอย่างน้อย อาจรวมถึงข้อกำหนดของเวอร์ชันหากคุณทราบว่าบางเวอร์ชันใช้งานไม่ได้ แต่ไม่ควรมีข้อกำหนดเวอร์ชันที่คุณไม่แน่ใจ (เช่นคุณไม่แน่ใจว่าการอ้างอิงในอนาคตจะทำให้ไลบรารีของคุณเสียหายหรือไม่)

ในทางกลับกันไฟล์ข้อกำหนดควรระบุสิ่งที่คุณรู้ว่าใช้งานได้และอาจรวมถึงการอ้างอิงเพิ่มเติมที่คุณแนะนำ ตัวอย่างเช่นคุณอาจใช้ SQLAlchemy แต่แนะนำ MySQL และใส่ MySQLdb ในไฟล์ข้อกำหนด)

โดยสรุป: install_requiresคือการป้องกันไม่ให้ผู้คนห่างจากสิ่งที่คุณรู้ว่าไม่ได้ผลในขณะที่ไฟล์ข้อกำหนดเพื่อนำผู้คนไปสู่สิ่งที่คุณรู้ว่าได้ผล เหตุผลประการหนึ่งคือinstall_requiresข้อกำหนดจะถูกตรวจสอบอยู่เสมอและไม่สามารถปิดใช้งานได้โดยไม่ต้องเปลี่ยนข้อมูลเมตาของแพ็กเกจ คุณจึงไม่สามารถลองชุดค่าผสมใหม่ได้อย่างง่ายดาย ไฟล์ข้อกำหนดจะถูกตรวจสอบในเวลาติดตั้งเท่านั้น


5
นี้จะหมายความว่าคุณควรจะสะท้อนsetup.py install_requires=deps ในrequirements.txt?
proppy

9
การมีทั้งข้อกำหนดใน setup.py และไฟล์ความต้องการเป็นสิ่งที่อันตรายเนื่องจากการทำซ้ำจะขอให้ไม่ซิงค์กัน
Sebastian Blask

1
นอกจากนี้คุณจะทำงานกับมันได้อย่างไร? ฉันถือว่าคุณใช้ไฟล์ข้อกำหนดหนึ่งครั้งเพื่อไปยังสถานะที่ใช้งานได้จริง จากนั้นติดตั้งด้วยแพ็คเกจจริงด้วย pip คุณจะไม่สามารถใช้งานได้-Uเนื่องจากอาจแทนที่การอ้างอิงจากไฟล์ข้อกำหนด? คุณจะอัพเกรดได้อย่างไร?
Sebastian Blask

1
คำตอบนี้ใช้ได้กับแอพพลิเคชั่นและแพ็คเกจอย่างเท่าเทียมกันหรือไม่ ลองนึกภาพ my-web-app (แอป) ขึ้นอยู่กับเครื่องมือบางอย่าง (แพ็คเกจ) ซึ่งทั้งสองอย่างนี้ขึ้นอยู่กับแพ็กเกจคำขอ หากเครื่องมือบางอย่างมีไฟล์ Requirement.txt ที่ปักหมุดเวอร์ชันเฉพาะหรือช่วงของการร้องขอดูเหมือนว่าจะสร้างปัญหาที่อาจเกิดขึ้นกับ my-web-app ซึ่งอาจระบุเวอร์ชัน / ช่วงเวอร์ชันที่ขัดแย้งกัน
Reece

2
ควรมีวิธีเดียวในการติดตั้งแพ็คเกจ ดังนั้นจึงไม่แนะนำให้ใช้ทั้งสองอย่างเว้นแต่คุณต้องการสร้างความสับสนให้กับผู้ร่วมให้ข้อมูลรายอื่น
Gewthen

18

นี่คือสิ่งที่ฉันใส่ไว้ใน setup.py:

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)

20
ระวังไฟล์ข้อกำหนดอาจมีความคิดเห็นและการรวมเข้าด้วยกัน คุณควรใช้ตัวแยกวิเคราะห์ pip
Romain Hardouin

1
ใช่ในที่สุดฉันก็เปลี่ยนสิ่งนี้เพื่อตัดความคิดเห็นออก pip parser ดูดีกว่าคำตอบของฉัน
rbp

7
เหตุใดจึงต้องใช้ไฟล์ข้อกำหนดหากทั้งหมดมีอยู่ใน setup.py แล้ว
Sebastian Blask

2
@RomainHardouin ตามที่กล่าวไว้ในความคิดเห็นสำหรับคำตอบที่เชื่อมโยงของคุณ pip ไม่ได้มีไว้เพื่อใช้ในลักษณะนั้น
akaihola

1
ใช่สิ่งนี้ใช้ได้ผลสำหรับฉันจนกระทั่ง--extra-index-urlจำเป็นต้องมีความสำคัญในข้อกำหนดและสิ่งนี้ก็ระเบิดขึ้นที่ใบหน้าของฉัน ขอบคุณ @RomainHardouin
Tommy

11

คู่มือผู้ใช้ Python Packaging มีหน้าเกี่ยวกับหัวข้อนี้ฉันขอแนะนำให้คุณอ่าน:

สรุป:

install_requiresจะมีการแสดงรายการการอ้างอิงของแพ็คเกจที่ต้องติดตั้งอย่างแน่นอนเพื่อให้แพ็คเกจทำงานได้ มันไม่ได้หมายถึงการตรึงอ้างอิงกับรุ่นเฉพาะ install_requires=['django>=1.8']แต่ช่วงที่ได้รับการยอมรับเช่น install_requiresเป็นที่สังเกตโดยpip install name-on-pypiและเครื่องมืออื่น ๆ

requirements.txtเป็นเพียงไฟล์ข้อความที่คุณสามารถเลือกใช้งานpip install -r requirements.txtได้ มันหมายถึงการมีรุ่นการอ้างอิงและ subdependencies django==1.8.1ทั้งหมดตรึงเช่นนี้ คุณสามารถสร้างได้โดยใช้pip freeze > requirements.txtไฟล์. (บริการบางอย่างเช่น Heroku จะทำงานpip install -r requirements.txtให้คุณโดยอัตโนมัติ) pip install name-on-pypiไม่ได้ดูrequirements.txtเฉพาะที่install_requires.


5

ฉันเคยใช้ a setup.pyและinstall_requiresเพราะมีที่เดียวที่จะดู มันมีประสิทธิภาพพอ ๆ กับการมีไฟล์ข้อกำหนดและไม่มีการทำซ้ำเพื่อรักษา


คำถามคือเมื่อจะใช้อย่างใดอย่างหนึ่งฉันไม่ได้สะกดออก แต่คำตอบของฉันคือบอกว่าฉันมักจะใช้อย่างใดอย่างหนึ่งและไม่เคยใช้คำอื่น ที่ไม่ตอบคำถามได้อย่างไร?
Sebastian Blask
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.