2014-01-13 11 views
21

Ich habe ein Modul, das sowohl auf Python 2 und Python 3 funktioniert. In Python < 3.2 Ich möchte ein bestimmtes Paket als Abhängigkeit installieren. Für Python> = 3.2.install_requires basierend auf Python-Version

Etwas wie:

install_requires=[ 
    "threadpool >= 1.2.7 if python_version < 3.2.0", 
], 

Wie kann man das machen?

+0

Mögliche Duplikat [install \ _requires in setup.py auf installierte Python-Version abhängig] (https://stackoverflow.com/questions/6080646/install-requires-in-setup-py-depending-on- installed-python-version) – ederag

Antwort

35

setuptools hat die Unterstützung für diese environment markers verwenden.

install_requires=[ 
    'enum34;python_version<"3.4"', 
    'pywin32 >= 1.0;platform_system=="Windows"' 
] 

Die Nutzung ist dies in der official documentation beschrieben. Basiert auf der change log wurde in V20.5 hinzugefügt, aber die Implementierung war nicht stabil bis 20.8.1 (das war nur eine Lücke von 15 Tagen).


Original-Antwort (noch gültig, aber vielleicht in Zukunft weiterentwickelt werden):

setuptools hat die Unterstützung für diese im extras_require Argument.

Das Format ist folgendes:

extras_require={ 
    ':python_version=="2.7"': ["mock"], 
}, 

Es wird die anderen Vergleichsoperatoren.


Leider ist es nicht in der documentation erwähnt. Während ich nach Antworten suchte, fand ich PEP-426 über "Umgebungsmarkierungen" sprechen. Mit diesem Satz konnte ich ein setuptools ticket mit folgendem Kommentar finden:

habe ich erfolgreich die Markierungen verfügen, um selektiv und deklarativ eine Abhängigkeit zu erfordern. Ein Beispiel finden Sie in backports.unittest_mock. Durch die "Extras" wird Mock benötigt, aber nur auf Python 2. Wenn ich mich auf Setuptools 17.1 verlassen kann, kann ich diese Abhängigkeit auf python_version < "3.3" ändern.

+1

Dies ist die richtige Antwort, im Übrigen wird darauf hingewiesen, dass ältere Python-Versionen (z. B. 2.7.6) Fehler werfen, weil ihre 'setuptools'-Version diese Syntax nicht erkennt. Wenn Sie mehr Kompatibilität benötigen, verwenden Sie eine portablere Version wie die von @iTayb. –

+1

Kennt jemand die Verwendung von ":" vor "python_version"? Ist es irgendwo dokumentiert? – AXO

+0

Was ist die früheste Version von setuptools, die diesen Marker unterstützt? – AXO

9

Dies wurde here diskutiert, es wäre der empfehlen Weg ist für die Python-Version in Ihrem setup.py mit sys.version_info testen;

import sys 

if sys.version_info >= (3,2): 
    install_requires = ["threadpool >= 1.2.7"] 
else: 
    install_requires = ["threadpool >= 1.2.3"] 

setup(..., install_requires=install_requires) 
+4

Diese Lösung ist zerbrechlich mit vielen Kombinationen von 'pip'- und' wheel'-Paketen. Wenn pip in Ihrem Namen Räder erstellt, wird die berechnete install_requires-Liste in die Radmetadaten geschrieben, und dann kann das zwischengespeicherte Rad in einer anderen Python-Version verwendet werden. –