2011-06-24 23 views
12

Chúng tôi có một phần giữ chỗ trứng không chứa mã và chỉ tồn tại vì lợi ích của việc kéo xuống một danh sách các gói phụ thuộc từ kho PyPi của chúng tôi.Có thể thể hiện sự phụ thuộc theo nền tảng cụ thể trong setup.py mà không cần tạo phiên bản cụ thể cho nền tảng trứng của tôi không?

Hầu hết các gói phụ thuộc này là không thuyết phục nền tảng, tuy nhiên một số gói chỉ được sử dụng trên nền tảng Win32.

Có thể nào đó làm cho nền tảng phụ thuộc có điều kiện, sao cho một phụ thuộc nhất định trong danh sách install_requires của tôi sẽ chỉ bị kéo xuống khi cài đặt trên Win32?

Cách khác: Có thể chỉ định danh sách phụ thuộc tùy chọn, sẽ được cài đặt nếu có, nhưng sẽ không gây ra easy_install nếu không đúng?

Trả lời

4

Sử dụng tùy chọn extras_require phân phối để làm 'hỗ trợ win32' một tính năng tùy chọn:

setup(
    ... 
    extras_require={ 
    'win32': 'pywin32' 
    }, 
    ... 
) 

Sau đó, xác định các tính năng win32 khi cài đặt trên Windows:

easy_install mypackage[win32] 

này sẽ kéo xuống pywin32 gói, trong đó được liệt kê như một sự phụ thuộc đối với tính năng 'win32' của mypackage.

Xem here để biết thêm thông tin về các tính năng tùy chọn.

11

Trong setup.py:

from setuptools import setup 
import sys 

setup(
    name="...", 
    install_requires=["This", "That"] + (
     ["WinOnly", "AnotherWinOnly"] if sys.platform.startswith("win") else [] 
     ) 
) 

distutils.util.get_platform có nhiều thông tin hơn sys.platform nếu bạn cần nó:

>>> sys.platform 
'linux2' 
>>> distutils.util.get_platform() 
'linux-i686' 
+3

Có lẽ danh sách các phụ thuộc được tạo ra bởi logic này sẽ được nướng trong siêu dữ liệu trứng của tôi, có nghĩa là nếu tôi * xây dựng * trứng trên Windows thì nó sẽ có các cửa sổ phụ thuộc, và sau đó sẽ thất bại trong việc cài đặt trên Linux, nơi những phụ thuộc không có sẵn? –

+0

Tôi không chắc nó hoạt động ra sao. Tôi giả định rằng kể từ khi '' thiết lập.py'' được thực hiện tại thời điểm cài đặt, các phụ thuộc sẽ được tạo ra tại thời điểm cài đặt. Nhưng điều này sẽ dễ dàng đủ để kiểm tra. – codeape

+3

Lưu ý rằng kiểm tra nền tảng phải là '' nếu sys.platform == 'win32''' hoặc nó sẽ chuyển trên Mac OS X (* darwin *), xem http://stackoverflow.com/questions/2144748/is- nó-an toàn-to-sử dụng-sys-nền tảng-win32-check-on-64-bit-python – kraymer

0

Khi trứng được xây dựng (sử dụng python setup.py bdist_egg), bạn có thể buộc thiết lập/phân phối để xây dựng một quả trứng cụ thể cho nền tảng.

from setuptools import setup 
import os 

# Monkey-patch Distribution so it always claims to be platform-specific. 
from distutils.core import Distribution 
Distribution.has_ext_modules = lambda *args, **kwargs: True 

requirements = ['generic-foo', 'generic-bar'] 

if os.getenv('WINDOWS_BUILD'): 
    requirements.extend(['a-windows-only-requirement']) 

setup(
    name="...", 
    install_requires=requirements 
) 

Bạn có thể sau đó chỉ cần làm:

# Force a windows build 
$ WINDOWS_BUILD=y python setup.py bdist_egg -p win32 
# Do a linux build -- you may not need to specify -p if you're happy 
# with your current linux architecture. 
$ python setup.py bdist_egg -p linux-i686 
+0

Đây là hacky; Ngoài ra, câu hỏi chỉ định * nếu không có * trứng nền tảng xây dựng cụ thể! –

6

thấy https://stackoverflow.com/a/32955538/875667 cho bánh xe

và điều này cho sdist hoặc phát hành trứng từ: http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies

Đôi khi một dự án có thể yêu cầu một phụ thuộc để chạy trên một nền tảng cụ thể. Điều này có thể để một gói mà trở lại cổng một mô-đun để nó có thể được sử dụng trong các phiên bản python cũ. Hoặc nó có thể là một gói được yêu cầu để chạy trên một hệ điều hành cụ thể. Điều này sẽ cho phép một dự án làm việc trên nhiều nền tảng khác nhau mà không cần cài đặt các phụ thuộc không cần thiết cho một nền tảng đang cài đặt dự án.

setup(
    name="Project", 
    ... 
    install_requires=[ 
     'enum34;python_version<"3.4"', 
     'pywin32 >= 1.0;platform_system=="Windows"' 
    ] 
) 
Các vấn đề liên quan