¿Hay alguna manera de tener un archivo de requisitos condicionales.txt para mi aplicación Python basada en la plataforma?

Tengo una aplicación de Python que escribí para ser compatible con las plataformas Linux y Windows. Sin embargo, hay un problema … Uno de los paquetes de Python que necesito para Windows no es compatible con Linux. Afortunadamente, hay otro paquete que proporciona la misma funcionalidad en Linux. Todas las demás dependencias son compatibles en ambas plataformas.

Sé que podría tener 2 archivos de requisitos separados para abordar las dependencias de ambas plataformas por separado. Algo como win_requirements.txt y linux_requirements.txt, sin embargo, este enfoque no parece ser la mejor manera de hacerlo.

Me pregunto si hay una manera en la que pueda tener solo un archivo Requirements.txt para que cualquier usuario pueda usar pip install -r requirements.txt para instalar todas las dependencias, independientemente de la plataforma en la que se encuentren.

Tal vez algo como ??:

 SOAPpy>=0.12.22 pycrypto>=2.6.1 suds>=0.4 Python-ldap>=2.4.19 paramiko>=1.15.2 nose>=1.3.4 selenium>=2.44.0 bottle>=0.12.8 CherryPy>=3.6.0 pika>=0.9.14 if platform.system() == 'Linux': wmi-client-wrapper>=0.0.12 else if platform.system() == 'Windows': WMI>=1.4.9 

Puedes crear un script install.py y llamar a pip por script.

 import pip _all_ = [ "SOAPpy>=0.12.22", "pycrypto>=2.6.1", "suds>=0.4", "Python-ldap>=2.4.19", "paramiko>=1.15.2", "nose>=1.3.4", "selenium>=2.44.0", "bottle>=0.12.8", "CherryPy>=3.6.0", "pika>=0.9.14", ] windows = ["wmi-client-wrapper>=0.0.12",] linux = ["WMI>=1.4.9",] darwin = [] def install(packages): for package in packages: pip.main(['install', package]) if __name__ == '__main__': from sys import platform install(_all_) if platform == 'windows': install(windows) if platform.startswith('linux'): install(linux) if platform == 'darwin': # MacOS install(darwin) 

Otra forma de resolver este problema utilizando solo los archivos de requirements debe ser la herencia de los requirements

requisitos.txt

 SOAPpy>=0.12.22 pycrypto>=2.6.1 suds>=0.4 Python-ldap>=2.4.19 paramiko>=1.15.2 nose>=1.3.4 selenium>=2.44.0 bottle>=0.12.8 CherryPy>=3.6.0 

windows.txt

 -r requirements.txt WMI>=1.4.9 

linux.txt

 -r requirements.txt WMI>=1.4.9 

Entonces puedes llamar solo el requisito equivalente a plataforma.

 pip install -r windows.txt pip install -r linux.txt 

Puede agregar ciertos requisitos condicionales después de un punto y coma particularmente útil para sys_platform y python_version.

Ejemplos:

 atomac==1.1.0; sys_platform == 'darwin' futures>=3.0.5; python_version < '3.0' futures>=3.0.5; python_version == '2.6' or python_version=='2.7' 

Aparentemente también puedes excluir versiones particulares de una biblioteca:

 futures>=3.0,!=3.0.5 

Se definen en PEP 508 y PEP 0345 (Marcadores de entorno) pero la syntax parece seguir el borrador de PEP 0496 .