2011-06-24 10 views
12

Mamy jajko zastępcze, które nie zawiera kodu i istnieje tylko w celu ściągnięcia listy zależnych pakietów z naszego repozytorium PyPi.Czy można wyrazić zależność od platformy w pliku setup.py bez budowania wersji mojego jaja na platformie?

Większość z tych zależnych pakietów nie jest platformą, jednak niektóre są używane tylko na platformach Win32.

Czy można w jakiś sposób uzależnić platformę zależności, aby dana zależność na mojej liście install_requires została ściągnięta tylko podczas instalacji na Win32?

Alternatywnie: Czy to możliwe, aby określić listę opcjonalnych zależności, który zostanie zainstalowany, jeśli są dostępne, ale nie spowoduje easy_install na niepowodzenie, jeśli nie są one?

Odpowiedz

4

Użyj opcji extras_require dystrybucji, aby 'Wsparcie win32' opcjonalną funkcję:

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

Następnie określ funkcję win32 podczas instalacji w systemie Windows:

easy_install mypackage[win32] 

To będzie ciągnąć w dół pakiet pywin32, który jest wymieniony jako zależność dla funkcji „Win32” z mypackage.

Aby uzyskać więcej informacji o funkcjach opcjonalnych, zobacz temat here.

11

W 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 ma więcej informacji niż sys.platform jeśli jest to potrzebne:

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

Przypuszczalnie lista zależności generowanych przez tą logiką będą pieczone w moim metadanych jaj, co oznacza, że ​​jeśli I * budowa * jajko na Windows to będzie mieć zależności Windows, a następnie nie zainstalować na Linuksie, gdzie te zależności nie są dostępne? –

+0

Nie jestem pewien jak to działa. Zakładałem, że od "instalacji.py'' jest wykonywany w czasie instalacji, zależności będą generowane w czasie instalacji. Ale powinno to być łatwe do przetestowania. – codeape

+3

Należy zauważyć, że sprawdzenie platformy powinno być '' if sys.platform == 'win32''' lub przejdzie na Mac OS X (* darwin *), zobacz http://stackoverflow.com/questions/2144748/is- it-safe-to-use-sys-platform-win32-check-on-64-bit-python – kraymer

0

Kiedy jajko jest budowane (przy użyciu python setup.py bdist_egg), możesz wymusić setuptools/distribute, aby zbudować jajko specyficzne dla platformy.

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 
) 

Następnie można po prostu zrobić:

# 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

To jest hacky; także, pytanie określa * bez * budowania specyficznych dla platformy jaj! –

6

zobaczyć https://stackoverflow.com/a/32955538/875667 dla kół

a to dla sdist lub wydania jaj od: http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies

Czasami projekt może wymagać zależność uruchamiana na określonej platformie. Może to być pakiet, który z powrotem portuje moduł, aby mógł być używany w starszych wersjach Pythona. Lub może to być pakiet wymagany do działania w określonym systemie operacyjnym. Umożliwi to projektowi pracę na wielu różnych platformach bez instalowania zależności, które nie są wymagane dla platformy, która instaluje projekt.

setup(
    name="Project", 
    ... 
    install_requires=[ 
     'enum34;python_version<"3.4"', 
     'pywin32 >= 1.0;platform_system=="Windows"' 
    ] 
)