Best Practices für die Python App-abhängige Paketverwaltung

Einführung

Die Verwaltung von Python-Paketen ist kompliziert.

Selbst wenn Sie bis zu einem gewissen Grad mit Python vertraut sind, können viele von Ihnen möglicherweise nicht alle erfassen.

Ich bin auch einer von ihnen.

In diesem Artikel werden daher die Best Practices für die Verwaltung abhängiger Pakete in Python-Anwendungen zusammengefasst.

Obwohl wir uns nicht mit der abhängigen Paketverwaltung in der Bibliothek befassen, kann es einige Punkte geben, die hilfreich sein können.

Best Practices ** Sammlung **?

Der Titel dieses Artikels lautet "Best Practices ** Collection **". Er sagte auch: "Ich werde die Best Practices zusammenfassen."

Was bedeutet das.

Die Antwort ist einfach. Es gibt keine einzige bewährte Methode für die Verwaltung von Abhängigkeitspaketen in Python.

Daher habe ich in diesem Artikel beschlossen, verschiedene Methoden einzuführen, anstatt mich für eine bewährte Methode zu entscheiden.

Wenn Sie eine neue Methode entdecken, werde ich sie nach Bedarf hinzufügen und diesen Artikel immer zu einer Sammlung bewährter Methoden machen.

Best-Practice-Sammlung

Traditional requirements.txt

$ pip install flake8
$ pip freeze > requirements.txt
$ cat requirements.txt
flake8==2.5.4
mccabe==0.4.0
pep8==1.7.0
pyflakes==1.0.0
$  pip install -r requieremnts.txt

Nach der Installation der erforderlichen Pakete werden alle installierten Pakete und ihre Versionen ausgedruckt.

Es ist nicht sehr praktisch und möglicherweise nicht die beste Vorgehensweise. Es wird hier jedoch aufgelistet, da es die häufigste Methode ist.

requirements.txt

$ echo "python-dateutil" > requirements.txt
$ echo "flake8" > testRequirements.txt
$ pip install -r requirements.txt -r testRequirements.txt
$ pip freeze > constraints.txt
$ cat constraints.txt
flake8==2.5.4
mccabe==0.4.0
pep8==1.7.0
pyflakes==1.0.0
python-dateutil==2.5.3
six==1.10.0
$ pip install -r requirements.txt -r testRequirements.txt -c constraints.txt

Dies ist eine praktischere Methode, die die einfache Anforderung.txt-Methode durch Constraints.txt ergänzt.

Die in die Einschränkungsdatei geschriebenen Informationen werden nicht zum Installationsziel hinzugefügt, und es werden nur Versionseinschränkungen angewendet. Weitere Informationen finden Sie unter Erklärender Artikel.

Schreiben Sie die Datei require.txt manuell, anstatt das Ergebnis des Pip Freeze zu schreiben. Beschreiben Sie nur die Pakete, die direkt davon abhängen, und geben Sie die Version nur auf das erforderliche Minimum an. In den meisten Fällen reicht es aus, anstelle von "pip install" die Datei "require.txt" anzugeben.

Anstatt keine detaillierten Informationen in die Datei "resources.txt" zu schreiben, korrigieren Sie die Version, indem Sie die Ausgabe von "pip freeze" in die Datei "resources.txt" schreiben.

Darüber hinaus kann die Gruppierung durchgeführt werden, indem sie nach Bedarf in mehrere Dateien aufgeteilt wird.

Beachten Sie, dass die in der Datei "settings.txt" geschriebenen Inhalte nicht installiert sind. Selbst wenn die Datei "resources.txt" gruppiert ist, kann die Datei "settings.txt" als einzelne Datei verbleiben.

setup.py + constraints.txt

from setuptools import setup

requires = ['python-dateutil']
extras = {'test': ['flake8']}

setup(
    name='app',
    install_requires=requires,
    test_requires=extras['test'],
    extras_require=extras,
)
$ pip install -e .[test]
$ pip freeze > constraints.txt
$ cat constraints.txt
app==0.0.0
flake8==2.5.4
mccabe==0.4.0
pep8==1.7.0
pyflakes==1.0.0
python-dateutil==2.5.3
six==1.10.0
$ pip install -e .[test] -c constraints.txt

Dies ist ein verbessertes Muster von setup.py + require.txt, das später unter Verwendung der Constraints-Datei beschrieben wird.

Beschreiben Sie die abhängigen Pakete mit install_require, extra_requires in setup.py.

Wenn Sie extra_requires als "extra_requires = {'test': ['flake8']}" angeben, können Sie das angegebene Paket mit pip install -e. [Test] installieren.

Da Constraints File eine relativ neue Funktion ist, haben nur wenige Projekte diese Methode übernommen, aber ich denke, dieses Muster ist besser als das nächste Muster, wenn es jetzt übernommen wird.

setup.py + requirements.txt

from setuptools import setup

requires = ['python-dateutil']
extras = {'test': ['flake8']}

setup(
    name='app',
    install_requires=requires,
    test_requires=extras['test'],
    extras_require=extras,
)
$ pip install -e .[test]
$ pip freeze > requirements.txt
$ cat requirements.txt
app==0.0.0
flake8==2.5.4
mccabe==0.4.0
pep8==1.7.0
pyflakes==1.0.0
python-dateutil==2.5.3
six==1.10.0
$ pip install -r requirements.txt

Diese Methode wurde häufig verwendet, wenn pip noch keine Constraints-Datei hatte, und wird auch in bekannten Paketen verwendet.

In diesem Fall wird das Ziel des Tests jedoch auch in die Datei require.txt geschrieben, sodass das Testpaket auch in der Produktionsumgebung installiert wird.

require.txt Sie können dies tun, indem Sie es teilen, aber es ist einfacher, die Constraints-Datei zu verwenden.

pip-tools

$ pip install pip-tools
$ echo "python-dateutil" > requirements.in
$ echo "flake8" > testRequirements.in
$ pip-compile --output-file requirements.txt requirements.in
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile --output-file requirements.txt requirements.in
#

python-dateutil==2.5.3
six==1.10.0               # via python-dateutil
$ pip-compile --output-file testRequirements.txt testRequirements.in
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile --output-file testRequirements.txt testRequirements.in
#  

flake8==2.5.4
mccabe==0.4.0             # via flake8
pep8==1.7.0               # via flake8
pyflakes==1.0.0           # via flake8
$ pip-sync requirements.txt testRequirements.txt
$ pip freeze
click==6.6
first==2.0.1
flake8==2.5.4
mccabe==0.4.0
pep8==1.7.0
pip-tools==1.6.5
pyflakes==1.0.0
python-dateutil==2.5.3
six==1.10.0

Dieses Muster verwendet ein Drittanbieter-Tool namens Pip-Tools.

pip-compile erstellt die Anforderung.txt aus den Anforderungen.in.

pip-sync installiert nicht nur die erforderlichen Pakete, sondern entfernt auch automatisch die unnötigen Pakete. Natürlich entfernt Pip-Sync keine Pip-Tools, auch wenn Sie Pip-Tools nicht in die Anforderungen aufnehmen.

Sie können Dateien auch gruppieren, indem Sie sie aufteilen.

Zusammenfassung

Im Folgenden finden Sie einige bewährte Methoden zum Verwalten abhängiger Pakete in Python-Apps.

Im Moment können wir nicht sagen, welches das beste ist, daher haben wir keine andere Wahl, als das beste entsprechend der Art des Projekts auszuwählen.

Wir hoffen, dass eine dieser Methoden so schnell wie möglich zum De-facto-Standard wird.

Recommended Posts

Best Practices für die Python App-abhängige Paketverwaltung
Python-Paketverwaltung mit IntelliJ
Persönliche Zusammenfassung des Python Package Management Tools
Python-Installation und Paketverwaltung mit pip
Installieren des Python-Paketverwaltungstools pip (Windows)
Persönliche Best Practices für die Python-Entwicklungsumgebung mit VS-Code
Python: Deep Learning-Praxis
Hinweise zur Entwicklung von Python-Paketen
Python-IP-Adresse Paket Memo
Python Package Manager-Vergleich
Hinweis zur Anaconda-Paketverwaltung
Python> Link> PyUserInput-Paket |