2015-03-23 2 views
17

Ich habe eine Python-Anwendung, die ich geschrieben habe, um sowohl mit Linux- als auch mit Windows-Plattformen kompatibel zu sein. Es gibt jedoch ein Problem ... Eines der Python-Pakete, die ich für Windows benötige, ist nicht mit Linux kompatibel. Glücklicherweise gibt es ein anderes Paket, das unter Linux dieselbe Funktionalität bietet. Alle anderen Abhängigkeiten sind in beiden Plattformen kompatibel.Gibt es eine Möglichkeit, eine bedingte requirements.txt-Datei für meine Python-Anwendung basierend auf der Plattform zu haben?

Ich weiß, ich könnte zwei separate Anforderungsdateien haben, um beide Plattformabhängigkeiten getrennt zu behandeln. Etwas wie win_requirements.txt und linux_requirements.txt, aber dieser Ansatz fühlt sich nicht wie der beste Weg an, es zu tun.

Ich frage mich, ob es einen Weg gibt, kann ich nur eine requirements.txt-Datei haben, so dass jeder Benutzer pip install -r requirements.txt verwenden kann, um alle Abhängigkeiten unabhängig davon zu installieren, welche Plattform sie sind?

Vielleicht so etwas wie ??:

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

Dringend empfohlen,: http://stackoverflow.com/a/35614580/872328 – PaulMest

Antwort

5

Sie könnten eine install.py Skript erstellen und pip durch Skript aufrufen.

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) 

Ein anderer Weg, um dieses Problem zu beheben, nur requirements Dateien verwenden, sollten 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 Erbe der Verwendung werden

-r requirements.txt 
WMI>=1.4.9 

Dann können Sie nur die Anforderung gleich Plattform nennen.

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

Danke, ich landete mit dem Installationsskript Sie vorgeschlagen, :) – Cas

+1

In additon, kann man Sie möchten die install.py-Datei sauber halten, indem Sie den Block all mit einer base_requirements.txt-Datei ersetzen und -r base_requirements.txt oben in den verschiedenen Anforderungsdateien verwenden. – Sven

58

Sie können bestimmte bedingte Anforderungen nach einem Semikolon hinzufügen, die für sys_platform und python_version besonders nützlich sind.

Beispiele:

futures>=3.0,!=3.0.5 

Sie sind in PEP 508 und PEP 0345 (Environment Markers) definiert aber die Syntax scheint den Entwurf PEP 0496 zu folgen:

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' 

Anscheinend kann man auch bestimmte Versionen einer Bibliothek ausschließen. statt der akzeptierte Antwort Blick auf Tony G Antwort

+0

ist es möglich, auch nach Pypy abzufragen? – sebix

+1

Eigentlich glaube ich seine PEP 508. –

+0

@ Sebix ja, schau dir die PEP an. –

Verwandte Themen