6

Ich habe eine Bibliothek (subx), die von subprocess32 abhängt. Die Bibliothek subprocess32 ist ein Backport für Python2.7 und bietet das Timeout kwarg.Dependency Management: Subprozess32 benötigt für Python2.7

Meine Bibliothek benötigt das Timeout Kwarg.

Ich brauche subprocess32 nur, wenn die Zielplattform Python2.x ist.

Wie soll ich die Abhängigkeit in meinem Projekt definieren?

Ich erhalte diese Fehlermeldung, wenn ich eine Abhängigkeit subprocess32 über "install_requires" (setup.py) und ich bin in einem python3 virtualenv definieren:

===> pip install -e git+https://github.com/guettli/subx.git#egg=subx 
Obtaining subx from git+https://github.com/guettli/subx.git#egg=subx 
    Cloning https://github.com/guettli/subx.git to ./src/subx 
Collecting subprocess32 (from subx) 
    Using cached subprocess32-3.2.7.tar.gz 
    Complete output from command python setup.py egg_info: 
    This backport is for Python 2.x only. 

    ---------------------------------------- 
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-lju3nl1y/subprocess32/ 

Antwort

6

Es ist eine deklarative Weise, aber afaik es erfordert eine mehr oder weniger aktuelle Version von setuptools (wenn ich die release notes richtig gelesen habe, benötigen Sie mindestens die 20.2-Version). Was Sie unten sehen werden, nennt man Umgebungsmarker. Sie sind in PEP 508 angegeben, lesen Sie es durch, um eine vollständige Liste der verfügbaren Marker und ein besseres Verständnis der Markersyntax zu erhalten, wenn Sie dies wünschen.

Für Python-Version nehmen wir Ihr Paket als ein Beispiel: Sie haben subprocess32 Abhängigkeit, die in python2.X Umgebung installiert werden sollte. Ihre Abhängigkeit wie folgt erhöhen:

install_requires=[ 
    'subprocess32; python_version<"3"', 
] 

das Paket subx mit python2.7 jetzt installieren ergibt:

Processing ./dist/subx-2017.8.0-py2-none-any.whl 
Collecting subprocess32; python_version < "3" (from subx==2017.8.0) 
Installing collected packages: subprocess32, subx 
Successfully installed subprocess32-3.2.7 subx-2017.8.0 

Wenn Sie es mit python3.X installieren, wird der Ausgang sein:

Processing ./dist/subx-2017.8.0-py3-none-any.whl 
Installing collected packages: subx 
Successfully installed subx-2017.8.0 

Beachten Sie, dass Die Installation von subprocess32 wird übersprungen.


Ein weiteres gängiges Beispiel ist plattformspezifische Abhängigkeiten zu erklären: Ich habe ein Projekt, das auditwheel installiert wird auf Linux und delocate auf MacOS erfordert. Ich erkläre die Abhängigkeiten wie folgt aus:

install_requires=[ 
    ... 
    'auditwheel==1.7.0; "linux" in sys_platform', 
    'delocate==0.7.1; "darwin" == sys_platform', 
] 

Beachten Sie, dass diese Prüfung für Linux benötigt, wenn Sie nicht ausdrücklich keine größeren Python-Version Ziel haben, weil:

$ python2 -c "import sys; print sys.platform" 
linux2 

aber

$ python3 -c "import sys; print sys.platform" 
linux 

so Wenn Ihr Paket beispielsweise nur mit python2.X funktioniert, können Sie den Scheck "linux2" == sys.platform verwenden. Dadurch wird Ihre Abhängigkeit nur mit python2.X installierbar.

+0

Dies scheint eine vollständige Antwort zu sein. In Windows 'sys.platform' wird jedoch' win32' für Windows und 'cygwin' für Windows/Cygwin gedruckt. –

+0

@ElisByberi afaik grundlegende Ausdrücke werden unterstützt, so "win32" == sys_platform oder "cygwin" == sys_platform sollte funktionieren. Es gibt jedoch andere Umgebungsmarkierungen wie "Plattformsystem", die diesem Fall wahrscheinlich besser entsprechen würden. Überprüfen Sie erneut [PEP 508] (https://www.python.org/dev/peps/pep-0508/#environment-markers) für weitere Details. – hoefling

5
import sys 

kw = {} 
if sys.version_info[0] == 2: 
    kw['install_requires'] = ['subprocess32'] 

setup(
    … 
    **kw 
) 
+3

Es wird dringend empfohlen, einige Erläuterungen zur Funktionsweise Ihres Codes hinzuzufügen. Einfaches Bereitstellen von Code ist nicht die beste Methode zum Erlernen der Programmierung und wird dem Post-Ersteller nicht so viel nützen, wie wenn er gut erklärt würde. Eine detaillierte Antwort wird Ihre Glaubwürdigkeit in der Gemeinschaft stärken, und Ihre Antworten werden zu positiven Stimmen führen. –

+0

Ja, funktioniert.Aber ich frage mich, ob es eine deklarative Lösung gibt. Das sieht nach Programmieren aus und definiert keine Abhängigkeiten. Versteh mich nicht falsch. Vielen Dank für Ihre Antwort! – guettli

+0

Dieser Ansatz funktioniert nur mit Quellentars, jedoch mit Rädern. – hoefling

Verwandte Themen