request.txt tùy thuộc vào phiên bản python


89

Tôi đang cố chuyển một gói python2 sang python3 (không phải của riêng tôi) bằng cách sử dụng sáu để nó tương thích với cả hai. Tuy nhiên, một trong các gói được liệt kê trong request.txt hiện được bao gồm trong python3 stdlib và phiên bản pypi không hoạt động trong python3 nên tôi muốn loại trừ nó có điều kiện. Thực hiện việc này trong setup.py thật dễ dàng, tôi chỉ có thể làm một số việc như:

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

Nhưng tôi cũng muốn request.txt phản ánh đúng danh sách. Tôi không thể tìm thấy bất cứ điều gì về điều này trong tài liệu pip. vì vậy có ai biết làm thế nào để làm điều đó, hoặc nếu nó thậm chí có thể?


1
Vui lòng thay đổi phản hồi được chấp nhận thành stackoverflow.com/a/33451105/99834 - chắc chắn là cách phù hợp để triển khai điều này.
sorin

Câu trả lời:


133

Bạn có thể sử dụng các điểm đánh dấu môi trường để đạt được điều này requirements.txtpip 6.0:

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

Nó cũng được hỗ trợ bởi setuptools bằng cách khai báo các yêu cầu bổ sung trong setup.py:

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

Xem thêm thông số kỹ thuật yêu cầu . Và Chuỗi cho các phiên bản chuỗi của các lệnh Python tương ứng.


Đẹp! Làm thế nào tôi có thể làm điều tương tự với sys.platform == "win32"? Tôi đã cố gắng sử dụng :sys.platform == "win32", nhưng tôi nhận được một lỗi "Invalid marker môi trường" từ setup()chức năng
André Caron

3
Cập nhật: PEP 496 - Dấu môi trường đã được thay thế bằng PEP 508 - Đặc tả phụ thuộc cho Gói phần mềm Python , chỉ định đầy đủ cú pháp khai báo phụ thuộc bao gồm cú pháp cho dấu môi trường .
jkdev

10

Bạn có thể tạo nhiều tệp yêu cầu, đặt các gói chung đó vào một tệp chung và đưa chúng vào một tệp yêu cầu pip khác với -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 cài đặt -r yêu cầu / python2.txt

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.