¿Es posible express una dependencia específica de la plataforma en setup.py sin crear versiones específicas de la plataforma de mi huevo?

Tenemos un huevo de marcador de posición que no contiene ningún código y solo existe para poder extraer una lista de paquetes dependientes de nuestro repository de PyPi.

La mayoría de estos paquetes dependientes son independientes de la plataforma, sin embargo, algunos solo se usan en plataformas Win32.

¿Es posible de alguna manera hacer que la dependencia de dependencias sea condicional, de modo que una dependencia dada en mi lista de install_requires solo se derribará cuando se instale en Win32?

Alternativamente: ¿Es posible especificar una lista de dependencias opcionales, que se instalarán si están disponibles, pero no causarán que la instalación easy_install falle si no lo están?

vea https://stackoverflow.com/a/32955538/875667 para las ruedas

y esto para la versión sdist o egg desde: http://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-platform-specific-dependencies

A veces, un proyecto puede requerir una dependencia para ejecutarse en una plataforma específica. Esto podría deberse a un paquete que respalde un módulo para que se pueda usar en versiones antiguas de python. O podría ser un paquete que se requiere para ejecutarse en un sistema operativo específico. Esto permitirá que un proyecto funcione en múltiples plataformas diferentes sin instalar dependencias que no son necesarias para una plataforma que está instalando el proyecto.

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

En 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 tiene más información que sys.platform si la necesita:

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

Use la opción de distribución extras_require para hacer de ‘win32 support’ una característica opcional:

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

Luego especifique la característica win32 al instalar en Windows:

 easy_install mypackage[win32] 

Esto desplegará el paquete pywin32 , que se enumera como una dependencia para la función ‘win32’ de mypackage.

Consulte aquí para obtener más información acerca de las características opcionales.

Cuando se python setup.py bdist_egg el huevo (utilizando python setup.py bdist_egg ), puede forzar a setuptools / distrib para construir un huevo específico de la plataforma.

 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 ) 

Entonces puedes simplemente hacer:

 # 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