Wann wird die Pip-Anforderungsdatei im Vergleich zu install_requires in setup.py verwendet?

94

Ich verwende pip mit virtualenv, um einige Python-Bibliotheken zu verpacken und zu installieren.

Ich würde mir vorstellen, dass das, was ich tue, ein ziemlich häufiges Szenario ist. Ich bin der Betreuer mehrerer Bibliotheken, für die ich die Abhängigkeiten explizit angeben kann. Einige meiner Bibliotheken sind von Bibliotheken von Drittanbietern abhängig, die transitive Abhängigkeiten aufweisen, auf die ich keinen Einfluss habe.

Was ich erreichen möchte, ist, dass eine pip installmeiner Bibliotheken alle Upstream-Abhängigkeiten herunterlädt / installiert. In der Pip-Dokumentation habe ich Probleme damit, ob / wie Anforderungsdateien dies alleine tun können oder ob sie wirklich nur eine Ergänzung zur Verwendung sind install_requires.

Würde ich install_requiresin all meinen Bibliotheken Abhängigkeiten und Versionsbereiche angeben und dann nur eine Anforderungsdatei verwenden, um einen Konflikt zu lösen und / oder sie für einen Produktionsbuild einzufrieren?

Stellen wir uns vor, ich lebe in einer imaginären Welt (ich weiß, ich weiß) und meine Upstream-Abhängigkeiten sind unkompliziert und garantieren niemals Konflikte oder brechen die Abwärtskompatibilität. Wäre ich gezwungen, überhaupt eine Pip-Anforderungsdatei zu verwenden, oder würde ich pip / setuptools / Distribute einfach alles basierend darauf installieren lassen install_requires?

Es gibt hier viele ähnliche Fragen, aber ich konnte keine finden, die so grundlegend waren, als ob man die eine oder die andere oder beide harmonisch zusammen verwenden sollte.

Joe Holloway
quelle
3
Dies ist ein sehr schöner Artikel, der die Beziehung der beiden und ihre Integration erklärt.
Björn Pollex

Antworten:

68

Meine Philosophie ist, dass install_requiresein Minimum von dem angegeben werden sollte, was Sie brauchen. Es kann Versionsanforderungen enthalten, wenn Sie wissen, dass einige Versionen nicht funktionieren. Es sollte jedoch keine Versionsanforderungen geben, bei denen Sie sich nicht sicher sind (z. B. wenn Sie nicht sicher sind, ob eine zukünftige Version einer Abhängigkeit Ihre Bibliothek beschädigen wird oder nicht).

Anforderungsdateien sollten andererseits angeben, was Ihrer Meinung nach funktioniert, und können optionale Abhängigkeiten enthalten, die Sie empfehlen. Zum Beispiel könnten Sie SQLAlchemy verwenden, aber MySQL vorschlagen und MySQLdb in die Anforderungsdatei einfügen.

Zusammenfassend lässt sich sagen install_requires, dass Personen von Dingen ferngehalten werden sollen, von denen Sie wissen, dass sie nicht funktionieren, während Anforderungsdateien Personen zu Dingen führen, von denen Sie wissen, dass sie funktionieren. Ein Grund dafür ist, dass install_requiresAnforderungen immer überprüft werden und nicht deaktiviert werden können, ohne die Paketmetadaten tatsächlich zu ändern. Sie können also nicht einfach eine neue Kombination ausprobieren. Anforderungsdateien werden nur zur Installationszeit überprüft.

Ian Bicking
quelle
5
setup.py install_requires=Bedeutet dies, dass Sie Deps spiegeln sollten requirements.txt?
Proppy
9
Beide Anforderungen in setup.py und eine Anforderungsdatei sind jedoch gefährlich, da bei der Duplizierung nur die Synchronisierung angefordert wird.
Sebastian Blask
1
Wie arbeiten Sie dann tatsächlich damit? Ich würde annehmen, dass Sie die Anforderungsdatei einmal verwenden, um zu einem Zustand zu gelangen, der definitiv funktioniert. Dann mit dem eigentlichen Paket mit pip installieren. Sie können es nie verwenden, -Uda dies die Abhängigkeiten aus der Anforderungsdatei überschreiben könnte. Wie aktualisierst du?
Sebastian Blask
1
Gilt diese Antwort gleichermaßen für Anwendungen und Pakete? Stellen Sie sich my-web-app (eine App) in Abhängigkeit von einem Tool (einem Paket) vor, die beide vom Anforderungspaket abhängen. Wenn ein Tool über eine Datei "require.txt" verfügt, die eine bestimmte Version oder einen bestimmten Versionsbereich von Anforderungen festhält, scheint dies ein potenzielles Problem für my-web-app zu sein, das möglicherweise einen widersprüchlichen Versions- / Versionsbereich angegeben hat.
Reece
2
Es sollte nur eine Möglichkeit geben, ein Paket zu installieren. Es wird daher nicht empfohlen, beides zu haben, es sei denn, Sie möchten andere Mitwirkende verwirren.
Gewthen
17

Folgendes habe ich in meine setup.py eingefügt:

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)
rbp
quelle
20
Achtung, Anforderungsdateien können Kommentare und Einschlüsse enthalten. Sie sollten den Pip Parser
Romain Hardouin
1
Ja, ich habe dies schließlich geändert, um Kommentare zu entfernen. Pip Parser sieht besser aus als meine Antwort.
rbp
7
Warum überhaupt eine Anforderungsdatei verwenden, wenn sich alles, was sie enthält, bereits in setup.py befindet?
Sebastian Blask
2
@RomainHardouin, wie in den Kommentaren zu Ihrer verknüpften Antwort erwähnt, soll pip nicht auf diese Weise verwendet werden.
Akaihola
1
Ja, das hat bei mir funktioniert, bis ein kritischer Eingriff --extra-index-urlin die Anforderungen erforderlich war und dies in meinem Gesicht explodierte. Danke @RomainHardouin
Tommy
11

Das Python Packaging-Benutzerhandbuch enthält eine Seite zu diesem Thema. Ich empfehle Ihnen dringend, sie zu lesen:

Zusammenfassung:

install_requiresHier werden die Abhängigkeiten des Pakets aufgelistet, die unbedingt installiert werden müssen, damit das Paket funktioniert. Es ist nicht beabsichtigt, die Abhängigkeiten an bestimmte Versionen zu binden, aber Bereiche werden beispielsweise akzeptiert install_requires=['django>=1.8']. install_requireswird von pip install name-on-pypiund anderen Werkzeugen beobachtet.

requirements.txtist nur eine Textdatei, gegen die Sie laufen können pip install -r requirements.txt. Versionen aller Abhängigkeiten und Unterabhängigkeiten sollen wie folgt angeheftet sein : django==1.8.1. Sie können eine mit erstellen pip freeze > requirements.txt. (Einige Dienste, wie Heroku, werden automatisch pip install -r requirements.txtfür Sie ausgeführt.) pip install name-on-pypiBetrachtet nicht, sondern requirements.txtnur install_requires.

Flimm
quelle
5

Ich benutze immer nur ein setup.pyund install_requiresweil es nur einen Ort zum Anschauen gibt. Es ist genauso leistungsfähig wie eine Anforderungsdatei und es müssen keine Duplikate verwaltet werden.

Sebastian Blask
quelle
Die Frage ist, wann man das eine oder das andere benutzt, ich habe es nicht formuliert, aber meine Antwort lautet, dass ich immer das eine und niemals das andere benutze. Wie beantwortet das nicht die Frage?
Sebastian Blask