wake-up-neo.com

requirements.txt vs setup.py

Ich begann mit Python zu arbeiten. Ich habe hinzugefügt requirements.txt und setup.py zu meinem Projekt. Aber ich bin immer noch verwirrt über den Zweck beider Dateien. Ich habe gelesen, dass setup.py ist für weiterverteilbare Dinge gedacht und das requirements.txt ist für nicht weiterverteilbare Dinge gedacht. Ich bin mir aber nicht sicher, ob dies korrekt ist.

Wie sollen diese beiden Dateien wirklich verwendet werden?

62
lucy

requirements.txt

Auf diese Weise können Sie Ihre Entwicklungsumgebung einrichten. Programme wie pip können verwendet werden, um alle in der Datei aufgeführten Pakete auf einen Schlag zu installieren. Danach können Sie Ihr python Skript entwickeln. Besonders nützlich, wenn Sie vorhaben, dass andere zur Entwicklung beitragen oder virtuelle Umgebungen verwenden. So verwenden Sie es:

pip install -r < requirements.txt

setup.py

Auf diese Weise können Sie Pakete erstellen, die Sie weitergeben können. Dieses Skript soll Ihr Paket auf dem System des Endbenutzers installieren und die Entwicklungsumgebung nicht wie pip install -r < requirements.txt Vorbereiten. Siehe diese Antwort für weitere Details zu setup.py.

Die Abhängigkeiten Ihres Projekts sind in beiden Dateien aufgeführt.

42
AndreasT

Die kurze Antwort lautet: requirements.txt Dient nur zum Auflisten der Paketanforderungen. setup.py Ist dagegen eher ein Installationsskript. Wenn Sie nicht vorhaben, den Code python zu installieren, benötigen Sie normalerweise nur requirements.txt.

Die Datei setup.py Beschreibt zusätzlich zu den Paketabhängigkeiten die Gruppe von Dateien und Modulen, die gepackt (oder kompiliert, bei nativen Modulen (dh in C geschrieben)) werden sollen, und die Metadaten, die hinzugefügt werden sollen zu den python Paketlisten (zB Paketname, Paketversion, Paketbeschreibung, Autor, ...).

Da in beiden Dateien Abhängigkeiten aufgelistet sind, kann dies zu geringfügigen Duplikationen führen. Lesen Sie unten für Details.

requirements.txt


Diese Datei listet die Paketanforderungen für python auf. Es ist eine reine Textdatei (optional mit Kommentaren), in der das Paket dependencies Ihres python -Projekts aufgeführt ist (eine pro Zeile). Es nicht ​​beschreibt die Art und Weise, in der Ihr python -Paket installiert wird. Die Anforderungsdatei verbrauchen Sie normalerweise mit pip install -r requirements.txt.

Der Dateiname der Textdatei ist willkürlich, wird jedoch häufig durch die Konvention requirements.txt Festgelegt. Beim Durchsuchen von Quellcode-Repositorys anderer python -Pakete können Sie auf andere Namen stoßen, z. B. dev-dependencies.txt Oder dependencies-dev.txt. Diese dienen demselben Zweck wie dependencies.txt, Listen jedoch im Allgemeinen zusätzliche Abhängigkeiten auf, die für Entwickler des jeweiligen Pakets von Interesse sind, und zwar zum Testen des Quellcodes (z. B. Pytest, Pylint usw.) vor der Veröffentlichung. Benutzer des Pakets benötigen im Allgemeinen nicht die gesamten Entwicklerabhängigkeiten, um das Paket auszuführen.

Wenn mehrere requirements-X.txt - Varianten vorhanden sind, werden in der Regel Laufzeitabhängigkeiten und die anderen Build-Zeit- oder Testabhängigkeiten aufgelistet. Einige Projekte kaskadieren auch ihre Anforderungsdatei, d. H. Wenn eine Anforderungsdatei eine andere Datei enthält ( Beispiel ). Dies kann Wiederholungen reduzieren.

setup.py


Dies ist ein python-Skript, das das setuptools -Modul verwendet, um ein python -Paket zu definieren (Name, enthaltene Dateien, Paketmetadaten und Installation). Es listet wie requirements.txt Auch Laufzeitabhängigkeiten des Pakets auf. Setuptools ist der de-facto-Weg, python -Pakete zu erstellen und zu installieren, aber es hat seine Mängel, die im Laufe der Zeit die Entwicklung neuer "Metapaket-Manager", wie pip, ausgelöst haben. Beispielhafte Mängel von setuptools sind die Unfähigkeit, mehrere Versionen desselben Pakets zu installieren, und das Fehlen eines Deinstallationsbefehls.

Wenn ein python Benutzer pip install ./pkgdir_my_module (Oder pip install my-module) Ausführt, führt pip setup.py In dem angegebenen Verzeichnis (oder Modul) aus. Ebenso kann jedes Modul, das einen setup.py Hat, pip- installiert werden, z. indem Sie pip install . aus demselben Ordner ausführen.

Brauche ich wirklich beides?


Kurze Antwort ist nein, aber es ist schön, beides zu haben. Sie dienen unterschiedlichen Zwecken, können jedoch beide zum Auflisten Ihrer Abhängigkeiten verwendet werden.

Es gibt einen Trick, den Sie in Betracht ziehen können, um zu vermeiden, dass Ihre Liste der Abhängigkeiten zwischen requirements.txt Und setup.py Dupliziert wird. Wenn Sie bereits einen voll funktionsfähigen setup.py Für Ihr Paket geschrieben haben und Ihre Abhängigkeiten größtenteils extern sind, können Sie einen einfachen requirements.txt Mit nur folgendem Inhalt in Betracht ziehen:

 # requirements.txt
 #
 # installs dependencies from ./setup.py, and the package itself,
 # in editable mode
 -e .

 # (the -e above is optional). you could also just install the package
 # normally with just the line below (after uncommenting)
 # .

Die Option -e Ist eine spezielle Option pip install, Mit der das angegebene Paket im Modus editierbar installiert wird. Wenn pip -r requirements.txt Für diese Datei ausgeführt wird, installiert pip Ihre Abhängigkeiten über die Liste in ./setup.py. Die bearbeitbare Option fügt einen Symlink in Ihr Installationsverzeichnis ein (anstelle eines Eies oder einer archivierten Kopie). Entwickler können Code direkt aus dem Repository heraus bearbeiten, ohne ihn erneut installieren zu müssen.

Sie können auch die sogenannten "setuptools-Extras" nutzen, wenn Sie beide Dateien in Ihrem Paket-Repository haben. Sie können optionale Pakete in setup.py unter einer benutzerdefinierten Kategorie definieren und diese Pakete nur aus dieser Kategorie mit pip installieren:

# setup.py
from setuptools import setup
setup(
   name="FOO"
   ...
   extras_require = {
       'dev': ['pylint'],
       'build': ['requests']
   }
   ...
)

und dann in der Anforderungsdatei:

# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]

Dadurch bleiben alle Ihre Abhängigkeitslisten in setup.py erhalten.

Anmerkung: Normalerweise würden Sie pip und setup.py von einer Sandbox aus ausführen, wie sie mit dem Programm virtualenv erstellt wurden. Dadurch wird vermieden, dass python Pakete außerhalb des Kontexts der Entwicklungsumgebung Ihres Projekts installiert werden.

32
init_js

Der Vollständigkeit halber sehe ich es hier in 3 verschiedenen Winkeln.

  1. Ihre gestalterischen Zwecke sind unterschiedlich

Dies ist die genaue Beschreibung, die aus der offiziellen Dokumentation (Hervorhebungsmine) zitiert wird:

Während install_requires (in setup.py) die Abhängigkeiten definiert für ein einzelnes Projekt, werden häufig Anforderungsdateien verwendet, um die Anforderungen zu definieren für ein vollständiges Python = Umwelt.

Während die Anforderungen für install_requires minimal sind, enthalten Anforderungsdateien häufig eine vollständige Auflistung der angehefteten Versionen, um wiederholbare Installationen einer vollständigen Umgebung zu erzielen.

Es ist jedoch möglicherweise immer noch nicht leicht zu verstehen. Im nächsten Abschnitt werden zwei Faktenbeispiele vorgestellt, die veranschaulichen, wie die beiden Ansätze auf unterschiedliche Weise verwendet werden sollen.

  1. Ihre tatsächlichen Verwendungen sind daher (angeblich) unterschiedlich

    • Wenn Ihr Projekt foo als eigenständige Bibliothek veröffentlicht wird (was bedeutet, dass andere wahrscheinlich import foo Tun würden), möchten Sie (und Ihre nachgeschalteten Anwender) eine flexible Abhängigkeitserklärung , so dass Ihre Bibliothek nicht "wählerisch" wäre (und auch nicht sein darf), welche genaue Version IHRER Abhängigkeiten sein sollte. In der Regel enthält Ihre setup.py folgende Zeilen:

      install_requires=[
          'A>=1,<2',
          'B>=2'
      ]
      
    • Wenn Sie Ihre aktuelle EXACT-Umgebung für Ihre Anwendung bar nur irgendwie "dokumentieren" oder "anheften" möchten, dh, Sie oder Ihre Benutzer möchten Ihre Anwendung bar unverändert verwenden, d. H Wenn Sie python bar.py ausführen, möchten Sie möglicherweise Ihre Umgebung einfrieren, damit sie sich immer gleich verhält. In diesem Fall würde Ihre Anforderungsdatei folgendermaßen aussehen:

      A==1.2.3
      B==2.3.4
      # It could even contain some dependencies NOT strickly required by your library
      pylint==3.4.5
      
  2. Welches verwende ich in Wirklichkeit?

    • Wenn Sie eine Anwendung bar entwickeln, die von python bar.py Verwendet wird, selbst wenn dies "nur zum Spaß ein Skript" ist, wird weiterhin empfohlen, die Datei requirements.txt zu verwenden, denn wer weiß, als Nächstes In der Woche (was zufällig Weihnachten ist) würden Sie einen neuen Computer als Geschenk erhalten, sodass Sie Ihre genaue Umgebung dort erneut einrichten müssten.

    • Wenn Sie eine Bibliothek foo entwickeln, die von import foo Verwendet wird, müssen Sie eine setup.py vorbereiten. Zeitraum. Sie können aber auch gleichzeitig eine requirements.txt bereitstellen, die Folgendes kann:

      (a) entweder im Stil A==1.2.3 sein (wie oben in Nr. 2 erläutert);

      (b) oder nur eine magische Single enthalten .

      .
      

      dies würde in etwa "Installieren der Anforderungen basierend auf setup.py" ohne Duplizierung entsprechen. Persönlich halte ich diesen letzten Ansatz für verwischend, was die Verwirrung vergrößert und keinen wirklichen Mehrwert schafft, aber es ist dennoch ein Trick, der aus einem Ansatz abgeleitet wurde, der von Python Verpackungsbetreuer Donald in - sein Blogpost .

7
RayLuo