2013-04-17 20 views
7

Czy jest jakiś sposób, aby powiedzieć setuptools lub rozpowszechniać wymagać pakietu na konkretnej platformie?Setuptools specyficzne zależności od platformy

W moim konkretnym przypadku, używam readline, który przychodzi jako część standardowej biblioteki w systemach UNIX, ale na Windows muszę moduł pyreadline zastąpić tę funkcjonalność (por this question). Jeśli tylko wprowadzę to w wymaganiach Instaluje się również na systemach Unix, gdzie jest całkowicie bezużyteczny.

Odpowiedz

6

setup.py to po prostu skrypt python. Można tworzyć dynamiczne zależności w tym skrypcie:

import platform 

setup_requires = ['foo', 'bar'] 

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

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

Czy to będzie działać, jeśli prześlę dystrybucję binarną? –

+0

Rozkłady binarne są * zależne od platformy *. Generalnie jednak chcesz uniknąć tworzenia dystrybucji binarnych; rób to tylko, jeśli twój pakiet zawiera rozszerzenia C, a potem tylko dla Windows. Zbudowałbyś już * te * w systemie Windows, więc zależność zostanie ustawiona poprawnie. –

+0

Działa to dobrze na 'python setup.py install', ale jeśli prześlę dystrybucję źródłową, jak to będzie działać dla klientów Windows próbujących zainstalować moją dystrybucję źródłową podczas jej pobierania za pomocą' pip install mypkg'? –

12

Choć answer podane przez Martijn Pieters był całkowicie poprawny w momencie, ponieważ wtedy pakowanie Python nie zmieniło się wiele.

Preferowanym formatem dystrybucji pakietów jest użycie wheels *. Korzystanie z kół nie jest możliwe uruchomienie kodu Python podczas instalacji.

Metadane dotyczące użycia koła, wersja 2, zgodnie z PEP 0427. Environment markers może być użyty do określenia zależnych od platformy zależności.

Narzędzie Setup umożliwia określenie tych znaczników środowiska jako kluczy extras_require. Poniższy skrypt przykładowy zależy od pyreadline dla systemów Windows i pyxdg dla dystrybucji systemu Linux.

* Zwolnij także sdist, więc platformy, które nie mogą używać koła, mogą zainstalować pakiet.

+2

To powinna być całkowicie akceptowana odpowiedź! –

+2

Zamiast ':: sys_platform ==" win32 "'', jest bardziej czytelny i intuicyjny w pisaniu, '' platform_system ==" Windows "". I zamiast '': "linux" w sys_platform'', możesz zrobić ''platform_system ==" Linux "". Obejmuje to zarówno "linux" i "linux2". To samo dotyczy innych platform, mac to ''platform_system ==" Darwin "", itp., Itp. Odniesienia: ['PEP 508'] (https://www.python.org/dev/peps/pep-0508/ # environment-markers) i [EasyBuilders] (https://github.com/easybuilders/easybuild/wiki/OS_flavor_name_version) – smac89

+0

Ponieważ zarówno 'install_requires' jak i' extras_require' posiadają mechanizm zależnych od platformy, po prostu zastanawiasz się, który z nich jest sugerowany ? Na przykład w 'Pipenv', wciąż jest problem z dodatkami extras_require w Pipfile ~ – Drake

1

Podczas gdy odpowiedzi udzielone przez Remco Haszing i Martijn Pieters są ważne i prawdopodobnie wygodniejsze, jeśli zamierzasz wspierać stare wersje setuptools, opakowanie Python bardzo się zmieniło od tego czasu. Zamierzam wskazać niektóre z nowych metod określania wymagań.

Najnowsze wersje setuptools zaakceptować PEP 508 stylu specyfikację Zależność:

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

wybrać odpowiedni parametr:

  • install_requires: Jakie inne dystrybucje, które są potrzebne do bieżącej dystrybucji pracować poprawnie
  • extras_require: słownik mapujący nazwy funkcji opcjonalnych do listy ich wymagań
  • setup_requires: inne dystrybucje, które muszą być przedstawiające, aby skrypt instalacyjny działał poprawnie Uwaga: projekty wymienione w setup_requires NIE zostaną automatycznie zainstalowane. Są one po prostu pobierane do katalogu ./.eggs, jeśli nie są już dostępne lokalnie.

Istnieje również alternatywny sposób dostarczania tych parametrów za pomocą pliku setup.cfg. See the documentation for more info.

Uwaga: Wsparcie dla PEP 508 i setup.cfg został dodany do setuptools stopniowo w miarę upływu czasu.Dlatego też, jeśli są używane, dependending od funkcji używasz, możesz dodać następujące linie na początku działalności swojej setup.py:

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.' 
    ) 

Teraz też mają PEP 518, który wprowadza nowe, bardziej zdolny sposób określania setup_requires w pyproject.toml pliku:

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

Jak widać, będziemy w stanie automatycznie instalować i aktualizować setuptools czy może jakieś inne narzędzie do pakowania. To will be probably shipped with pip 9.1.

Powiązane problemy