2015-03-23 5 views
17

Ho un'applicazione python che ho scritto per essere compatibile con entrambe le piattaforme Linux e Windows. Tuttavia c'è un problema ... Uno dei pacchetti Python di cui ho bisogno per Windows non è compatibile con Linux. Fortunatamente c'è un altro pacchetto che fornisce la stessa funzionalità su Linux. Tutte le altre dipendenze sono compatibili in entrambe le piattaforme.C'è un modo per avere un file requirements.txt condizionale per la mia applicazione Python basata su piattaforma?

So che potrei avere 2 file di requisiti separati per indirizzare separatamente entrambe le dipendenze della piattaforma. Qualcosa come win_requirements.txt e linux_requirements.txt, tuttavia questo approccio non sembra il modo migliore per farlo.

Mi chiedo se esiste un modo per avere un solo file requirements.txt in modo che ogni utente possa utilizzare pip install -r requirements.txt per installare tutte le dipendenze indipendentemente dalla piattaforma in cui si trovano?

Forse qualcosa di simile ??:

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 
+4

consiglia vivamente di guardare la risposta di Tony G al posto della risposta accettata: http://stackoverflow.com/a/35614580/872328 – PaulMest

risposta

5

è possibile creare uno script install.py e chiamare pip dallo 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) 

Un altro modo per risolvere questo problema utilizzando solo requirements file dovrebbe usare l'ereditarietà di requirements

requirements.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 

Quindi è possibile chiamare solo il requisito equivalente alla piattaforma.

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

Grazie, ho finito per usare lo script di installazione hai suggerito, :) – Cas

+1

In additon, si può vuoi mantenere il pulitore install.py sostituendo tutto il blocco con un file base_requirements.txt e usando -r base_requirements.txt nella parte superiore dei diversi file di requisiti. – Sven

58

È possibile aggiungere determinati requisiti condizionali dopo un punto e virgola particolarmente utile per sys_platform e python_version.

Esempi:

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' 

A quanto pare è anche possibile escludere particolari versioni di una libreria:

futures>=3.0,!=3.0.5 

Essi sono definiti in PEP 508 e PEP 0345 (Environment Markers) ma la sintassi sembra seguire il progetto di PEP 0496.

+0

è possibile interrogare anche per pypy? – sebix

+1

In realtà, credo che sia PEP 508. –

+0

@ sebix si dare un'occhiata al PEP. –