require.txt abhängig von der Python-Version

88

Ich versuche, ein python2-Paket mit sechs auf python3 (nicht mein eigenes) zu portieren, damit es mit beiden kompatibel ist. Eines der in require.txt aufgelisteten Pakete ist jetzt in der python3 stdlib enthalten, und die pypi-Version funktioniert in python3 nicht, daher möchte ich es bedingt ausschließen. Dies in setup.py zu tun ist einfach, ich kann einfach so etwas tun wie:

if sys.version_info[0] == 2:
    requirements += py2_requirements
else:
    requirements += py3_requirements

Ich möchte aber auch, dass die Datei require.txt auch die richtige Liste widerspiegelt. Ich kann dazu nichts in der Pip-Dokumentation finden. Weiß jemand, wie es geht oder ob es überhaupt möglich ist?

aquavitae
quelle
1
Bitte ändern Sie die akzeptierte Antwort in stackoverflow.com/a/33451105/99834 - was zweifellos der richtige Weg ist, dies zu implementieren.
Sorin

Antworten:

129

Sie können die Umgebungsmarkierungen verwenden , um dies zu erreichen, requirements.txtda pip 6.0:

SomeProject==5.4; python_version < '2.7'
SomeProject; sys_platform == 'win32'

Es wird auch von setuptools unterstützt, indem zusätzliche Anforderungen deklariert werden in setup.py:

setup(
    ...
    install_requires=[
        'six',
        'humanize',
    ],
    extras_require={
        ':python_version == "2.7"': [
            'ipaddress',
        ],
    },
)

Siehe auch Anforderungsspezifizierer . Und Strings für die String-Versionen der entsprechenden Python-Befehle.

Jiangge Zhang
quelle
Nett! Wie kann ich dasselbe machen sys.platform == "win32"? Ich habe versucht, zu verwenden :sys.platform == "win32", aber ich erhalte einen Fehler "Ungültige Umgebungsmarkierung" von der setup()Funktion
André Caron
3
Update: PEP 496 - Umgebungsmarkierungen wurde durch PEP 508 - Abhängigkeitsspezifikation für Python-Softwarepakete ersetzt , in der die Syntax der Abhängigkeitsdeklaration einschließlich der Syntax für Umgebungsmarkierungen vollständig angegeben ist .
JKDEV
10

Sie können mehrere Anforderungsdateien erstellen, diese allgemeinen Pakete in einer gemeinsamen Datei ablegen und sie in eine andere Pip-Anforderungsdatei mit aufnehmen -r file_path

requirements/
  base.txt
  python2.txt
  python3.txt

python2.txt:

-r base.txt
Django==1.4 #python2 only packages

python3.txt:

-r base.txt
Django==1.5 #python3 only packages

pip install -r Anforderungen / python2.txt

Leonardo.Z
quelle