Meilleures pratiques de gestion des packages dépendant des applications Python

introduction

La gestion des packages Python est compliquée.

Même si vous êtes familier avec Python dans une certaine mesure, beaucoup d'entre vous ne seront peut-être pas en mesure de les comprendre tous.

Je suis également l'un d'entre eux.

Par conséquent, cet article résume les meilleures pratiques pour la gestion des packages dépendants dans les applications Python.

Notez que nous ne traiterons pas de la gestion des paquets dépendants dans la bibliothèque, mais certains points peuvent être utiles.

Meilleures pratiques ** Collection **?

Le titre de cet article est "Best Practices ** Collection **". Il a également déclaré: "Je vais ** résumer les meilleures pratiques **."

Qu'est-ce que ça veut dire.

La réponse est simple. Il n'y a pas de meilleure pratique unique pour la méthode de gestion des packages de dépendances de Python.

Par conséquent, dans cet article, j'ai décidé d'introduire diverses méthodes au lieu de choisir une meilleure pratique.

De plus, si vous découvrez une nouvelle méthode, je l'ajouterai au besoin, et je vise à faire de cet article toujours un recueil de bonnes pratiques.

Collection de bonnes pratiques

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

Après avoir installé les packages requis, il imprime tous les packages installés et leurs versions.

Ce n'est pas très pratique et n'est peut-être pas la meilleure pratique. Cependant, elle est répertoriée ici car c'est la méthode la plus courante.

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

Il s'agit d'une méthode plus pratique qui complète la méthode requirements.txt simple avec contraintes.txt.

Les informations écrites dans le fichier de contraintes ne sont pas ajoutées à la cible d'installation et seules les contraintes de version sont appliquées. Pour plus de détails, reportez-vous à Article explicatif.

Écrivez requirements.txt manuellement au lieu d'écrire le résultat de pip freeze. Décrivez uniquement les packages qui en dépendent directement et spécifiez la version uniquement au minimum nécessaire. Dans la plupart des cas, au lieu de pip install, il suffit de le mettre dans requirements.txt.

Au lieu de ne pas écrire d'informations détaillées dans requirements.txt, corrigez la version en écrivant la sortie de pip freeze dans contraintes.txt.

De plus, le regroupement peut être effectué en divisant en plusieurs fichiers selon les besoins.

Notez que le contenu écrit dans contraintes.txt n'est pas installé, donc même si requirements.txt est groupé, contraintes.txt peut rester sous forme de fichier unique.

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

Il s'agit d'un modèle amélioré de setup.py + requirements.txt décrit plus tard à l'aide du fichier de contraintes.

Écrivez des packages dépendants à l'aide de install_require, extra_requires dans setup.py.

Si vous spécifiez extra_requires comme ʻextra_requires = {'test': ['flake8']} , vous pouvez installer le paquet spécifié avec pip install -e. [Test]`.

Puisque le fichier de contraintes est une fonctionnalité relativement nouvelle, peu de projets ont adopté cette méthode, mais je pense que ce modèle est meilleur que le modèle suivant s'il est adopté maintenant.

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

Il s'agit d'une technique souvent utilisée lorsque pip n'avait pas encore de fichier de contraintes, et est également utilisée dans des packages bien connus.

Cependant, dans ce cas, la cible du test est également écrite dans requirements.txt, de sorte que le package de test sera installé même dans l'environnement de production.

requirements.txt Vous pouvez le faire en le divisant, mais il est plus simple d'utiliser le fichier de contraintes.

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

Ce modèle utilise un outil tiers appelé pip-tools.

pip-compile crée requirements.txt à partir de requirements.in.

pip-sync installe non seulement les packages requis, mais supprime également automatiquement les packages inutiles. Bien sûr, pip-sync ne supprime pas pip-tools même si vous n'incluez pas pip-tools dans requirements.in.

Vous pouvez également regrouper des fichiers en les fractionnant.

Résumé

Voici quelques bonnes pratiques pour gérer les packages dépendants dans les applications Python.

Pour le moment, nous ne pouvons pas dire lequel est le meilleur, nous n'avons donc pas d'autre choix que de choisir le meilleur selon la nature du projet.

Nous espérons que l’une de ces méthodes deviendra la norme de fait dès que possible.

Recommended Posts

Meilleures pratiques de gestion des packages dépendant des applications Python
Gestion des packages Python avec IntelliJ
Résumé personnel de l'outil de gestion de packages Python
Installation de Python et gestion des packages avec pip
Installation de l'outil de gestion des packages Python pip (Windows)
Meilleures pratiques personnelles pour l'environnement de développement Python basé sur VS Code
Python: pratique du Deep Learning
Notes de développement de package Python
Mémo du package d'adresse IP Python
Comparaison du gestionnaire de packages Python
Remarque sur la gestion des packages Anaconda
python> Lien> Package PyUserInput |