2013-04-17 39 views
7

Có cách nào để thông báo cho bộ cài đặt hoặc phân phối để yêu cầu gói trên nền tảng cụ thể không?Cài đặt nền tảng phụ thuộc cụ thể

Trong trường hợp cụ thể, tôi đang sử dụng readline, một thư viện chuẩn trên hệ thống Unix, nhưng trên Windows, tôi cần mô-đun pyreadline để thay thế chức năng đó (xem this question). Nếu tôi chỉ cần đặt nó trong các yêu cầu Nó cũng cài đặt trên các hệ thống Unix, nơi nó hoàn toàn vô dụng.

Trả lời

6

setup.py đơn giản chỉ là một tập lệnh python. Bạn có thể tạo phụ thuộc năng động trong kịch bản:

import platform 

setup_requires = ['foo', 'bar'] 

if platform.system() == 'Windows': 
    setup_requires.append('pyreadline') 

setup(
    # ... 
    setup_requires=setup_requires, 
) 
+1

Điều đó vẫn hoạt động nếu tôi tải lên bản phân phối nhị phân? –

+0

Phân phối nhị phân là * nền tảng cụ thể *. Bạn thường muốn tránh tạo ra các bản phân phối nhị phân mặc dù; chỉ làm điều đó nếu gói của bạn chứa phần mở rộng C, và sau đó chỉ dành cho Windows. Và bạn sẽ xây dựng * những * đó trên Windows, vì vậy sự phụ thuộc sẽ được đặt chính xác. –

+0

Điều này làm việc tốt cho 'python setup.py install', nhưng nếu tôi tải lên bản phân phối nguồn, làm thế nào nó sẽ làm việc cho các máy khách Windows đang cố gắng cài đặt phân phối nguồn của tôi khi tải nó bằng cách sử dụng' pip install mypkg'? –

12

Trong khi answer do Martijn Pieters là hoàn toàn hợp lệ vào thời điểm đó, Python bao bì đã thay đổi rất nhiều kể từ đó.

Định dạng ưa thích để phân phối gói đang sử dụng wheels *. Sử dụng bánh xe không thể chạy mã Python trong khi cài đặt.

Phiên bản siêu dữ liệu sử dụng bánh xe hai như được chỉ định trong PEP 0427. Environment markers có thể được sử dụng để chỉ định các phụ thuộc cụ thể cho nền tảng.

Trình thiết lập cho phép chỉ định các dấu môi trường này làm các phím extras_require. Tập lệnh mẫu sau phụ thuộc vào pyreadline cho các hệ thống Windows và trên pyxdg cho bản phân phối Linux.

#!/usr/bin/env python 
from setuptools import setup 

setup(
    name='spam', 
    version='0.0.1', 
    extras_require={ 
     ':sys_platform == "win32"': [ 
      'pyreadline' 
     ], 
     ':"linux" in sys_platform': [ 
      'pyxdg' 
     ] 
    }) 

* Cũng phát hành một sdist, do đó nền tảng không thể sử dụng bánh xe vẫn có thể cài đặt gói của bạn.

+2

Điều này hoàn toàn nên là câu trả lời được chấp nhận! –

+2

Thay vì '': sys_platform ==" win32 "'', nó dễ đọc và trực quan hơn để viết, ''platform_system ==" Windows "''. Và thay vì '':" linux "trong sys_platform'', bạn có thể làm'' platform_system == "Linux" ''. Điều này sẽ bao gồm cả 'linux' và 'linux2'. Tương tự với các nền tảng khác, mac là ''platform_system ==" Darwin "'', v.v. Tham khảo: ['PEP 508'] (https://www.python.org/dev/peps/pep-0508/ # environment-markers) và [EasyBuilders] (https://github.com/easybuilders/easybuild/wiki/OS_flavor_name_version) – smac89

+0

Vì cả hai 'install_requires' và' extras_require' đều có cơ chế cho các nền tảng phụ thuộc cụ thể, chỉ cần tự hỏi cái nào được đề xuất ? Ví dụ, trong 'Pipenv', vẫn còn một vấn đề để hỗ trợ extras_require trong Pipfile ~ – Drake

1

Trong khi câu trả lời được đưa ra bởi Remco Haszing và Martijn Pieters là hợp lệ, và có lẽ thuận tiện hơn nếu bạn định hỗ trợ các phiên bản cũ setuptools, bao bì Python đã thay đổi rất nhiều kể từ đó. Tôi sẽ chỉ ra một số phương pháp mới để xác định các yêu cầu.

các phiên bản gần đây của setuptools chấp nhận PEP 508 phong cách phụ thuộc đặc điểm kỹ thuật:

setup(
    # ... 
    install_requires=[ 
     'pyreadline; platform_system == "Windows"', 
    ], 
) 

Chọn tham số đúng:

  • install_requires: những gì các bản phân phối khác cần thiết cho việc phân phối hiện tại để làm việc một cách chính xác
  • extras_require: từ điển ánh xạ tên các tính năng tùy chọn vào danh sách các yêu cầu của chúng
  • setup_requires: các bản phân phối khác cần phải là trình bày cho tập lệnh thiết lập để chạy chính xác Lưu ý: các dự án được liệt kê trong setup_requires sẽ KHÔNG được cài đặt tự động. Chúng chỉ được tải xuống thư mục ./.eggs nếu chúng chưa sẵn có tại địa phương.

Ngoài ra còn có một cách khác để cung cấp các thông số này thông qua tệp setup.cfg. See the documentation for more info.

Lưu ý: Hỗ trợ cho PEP 508 và setup.cfg đã được dần dần được thêm vào setuptools theo thời gian.Vì vậy nếu bạn đang sử dụng chúng, dependending vào các tính năng bạn đang sử dụng, bạn có thể muốn thêm những dòng sau vào beggining của setup.py của bạn:

from distutils.version import StrictVersion 
from setuptools import __version__ as setuptools_version 


if StrictVersion(setuptools_version) < StrictVersion('38.3.0'): 
    raise SystemExit(
     'Your `setuptools` version is old. ' 
     'Please upgrade setuptools by running `pip install -U setuptools` ' 
     'and try again.' 
    ) 

Chúng tôi bây giờ cũng có PEP 518, giới thiệu một mới và có khả năng hơn cách để xác định setup_requires trong pyproject.toml file:

[build-system] 
# Minimum requirements for the build system to execute. 
requires = ['setuptools>"38.3.0"', 'wheel'] # PEP 508 specifications. 

Như bạn có thể thấy, chúng tôi sẽ có thể tự động cài đặt và cập nhật setuptools hoặc có lẽ một số công cụ đóng gói khác. Điều này will be probably shipped with pip 9.1.

Các vấn đề liên quan