Requirement.txt ขึ้นอยู่กับเวอร์ชันของ python


91

ฉันกำลังพยายามพอร์ตแพ็คเกจ python2 เป็น python3 (ไม่ใช่ของฉันเอง) โดยใช้ six เพื่อให้เข้ากันได้กับทั้งสองอย่าง อย่างไรก็ตามหนึ่งในแพ็คเกจที่ระบุไว้ใน requirements.txt ตอนนี้รวมอยู่ใน python3 stdlib แล้วและเวอร์ชัน pypi ไม่ทำงานใน python3 ดังนั้นฉันต้องการยกเว้นตามเงื่อนไข การทำสิ่งนี้ใน setup.py นั้นง่ายมากฉันสามารถทำสิ่งต่างๆเช่น:

if sys.version_info[0] == 2:
    requirements += py2_requirements
else:
    requirements += py3_requirements

แต่ฉันต้องการให้ requirements.txt แสดงรายการที่ถูกต้องด้วย ฉันไม่พบสิ่งนี้ในเอกสาร pip ไม่มีใครรู้วิธีทำหรือถ้าเป็นไปได้


1
โปรดเปลี่ยนคำตอบที่ยอมรับเป็นstackoverflow.com/a/33451105/99834ซึ่งเป็นวิธีที่ถูกต้องในการนำไปใช้อย่างไม่ต้องสงสัย
sorin

คำตอบ:


140

คุณสามารถใช้เครื่องหมายสภาพแวดล้อมเพื่อบรรลุสิ่งนี้ได้requirements.txtตั้งแต่pip 6.0:

SomeProject==5.4; python_version < '2.7'
SomeProject; sys_platform == 'win32'

ได้รับการสนับสนุนโดย setuptools เช่นกันโดยการประกาศข้อกำหนดเพิ่มเติมในsetup.py:

setup(
    ...
    install_requires=[
        'six',
        'humanize',
    ],
    extras_require={
        ':python_version == "2.7"': [
            'ipaddress',
        ],
    },
)

โปรดดูตัวระบุข้อกำหนดด้วย และสตริงสำหรับเวอร์ชันสตริงของคำสั่ง Python ที่เกี่ยวข้อง


ดี! ฉันจะทำเช่นเดียวกันกับsys.platform == "win32"? ฉันลองใช้:sys.platform == "win32"แต่ได้รับข้อผิดพลาด "Invalid environment marker" จากsetup()ฟังก์ชัน
André Caron

3
ปรับปรุง: PEP 496 - สิ่งแวดล้อมเครื่องหมายได้รับการแทนที่โดยPEP 508 - ข้อกำหนดพึ่งพาสำหรับแพคเกจหลามซอฟแวร์ที่เต็มระบุไวยากรณ์ประกาศพึ่งพารวมทั้งไวยากรณ์สำหรับเครื่องหมายสภาพแวดล้อม
jkdev

11

คุณสามารถสร้างไฟล์ข้อกำหนดหลายไฟล์วางแพ็กเกจทั่วไปเหล่านั้นในไฟล์ทั่วไปและรวมไว้ในไฟล์ข้อกำหนด pip อื่นด้วย -r file_path

requirements/
  base.txt
  python2.txt
  python3.txt

python2.txt:

-r base.txt
Django==1.4 #python2 only packages

python3.txt:

-r base.txt
Django==1.5 #python3 only packages

ข้อกำหนดการติดตั้ง pip -r / python2.txt

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