La bibliothèque standard de Python a des modules pour l' analyse des fichiers de configuration ( configparser ), la lecture des variables d'environnement ( os.environ ) et l' analyse des arguments de ligne de commande ( argparse ). Je veux écrire un programme qui fait tout cela, et aussi:
A une cascade de valeurs d'option :
- valeurs d'option par défaut, remplacées par
- options du fichier de configuration, remplacées par
- variables d'environnement, remplacées par
- options de ligne de commande.
Autorise un ou plusieurs emplacements de fichier de configuration spécifiés sur la ligne de commande avec par exemple
--config-file foo.conf
, et lit cela (soit à la place, soit en plus du fichier de configuration habituel). Cela doit toujours obéir à la cascade ci-dessus.Permet aux définitions d'options en un seul endroit de déterminer le comportement d'analyse des fichiers de configuration et de la ligne de commande.
Unifie les options analysées en une seule collection de valeurs d'options pour que le reste du programme puisse y accéder sans se soucier d'où elles viennent.
Tout ce dont j'ai besoin se trouve apparemment dans la bibliothèque standard Python, mais ils ne fonctionnent pas correctement ensemble.
Comment puis-je y parvenir avec un écart minimum par rapport à la bibliothèque standard Python?
jterrace
donné une prime ici pour me pousser assez loin pour essayer de faire quelque chose comme ça :)Réponses:
Le module argparse rend cela pas fou, tant que vous êtes satisfait d'un fichier de configuration qui ressemble à une ligne de commande. (Je pense que c'est un avantage, car les utilisateurs n'auront à apprendre qu'une seule syntaxe.) Définir fromfile_prefix_chars à, par exemple
@
, fait en sorte que,est équivalent à
si
@baz.conf
c'est,Vous pouvez même faire rechercher votre code
foo.conf
automatiquement en modifiantargv
Le format de ces fichiers de configuration est modifiable en créant une sous-classe de ArgumentParser et en ajoutant une méthode convert_arg_line_to_args .
la source
MISE À JOUR: J'ai finalement réussi à mettre cela sur pypi. Installez la dernière version via:
Une aide et des instructions complètes sont disponibles ici .
Message original
Voici un petit quelque chose que j'ai piraté ensemble. N'hésitez pas à suggérer des améliorations / rapports de bogues dans les commentaires:
FAIRE
Cette implémentation est encore incomplète. Voici une liste partielle de TODO:
argparse
gère les messages d'erreurConforme au comportement documenté
dest
deargs
dansadd_argument
, au lieu de compter sur l'Action
objetparse_args
fonction qui utiliseparse_known_args
. (par exemple une copieparse_args
de l'cpython
implémentation pour garantir qu'elle appelleparse_known_args
.)Moins de choses faciles…
Je n'ai encore rien essayé de tout ça. Il est peu probable - mais toujours possible! - que cela puisse fonctionner…
section
dans le fichier de configuration.)section
dans le fichier de configuration.)la source
pip install configargparser
Il existe une bibliothèque qui fait exactement cela appelé configglue .
Il prend également en charge les variables d'environnement.
Il existe également une autre bibliothèque appelée ConfigArgParse qui est
Vous pourriez être intéressé par PyCon parler de configuration par Łukasz Langa - Laissez-les configurer!
la source
Bien que je ne l'ai pas essayé par moi-même, il existe la bibliothèque ConfigArgParse qui indique qu'elle fait la plupart des choses que vous voulez:
la source
Il semble que la bibliothèque standard ne répond pas, laissant chaque programmeur pour bricoler
configparser
etargparse
etos.environ
tous ensemble de manière maladroites.la source
La bibliothèque standard Python ne fournit pas cela, pour autant que je sache. J'ai résolu cela moi-même en écrivant du code à utiliser
optparse
etConfigParser
à analyser la ligne de commande et les fichiers de configuration, et en fournissant une couche d'abstraction par-dessus. Cependant, vous en auriez besoin en tant que dépendance distincte, ce qui, d'après votre commentaire précédent, ne semble pas acceptable.Si vous voulez regarder le code que j'ai écrit, c'est sur http://liw.fi/cliapp/ . Il est intégré dans ma bibliothèque "framework d'application en ligne de commande", car c'est une grande partie de ce que le framework doit faire.
la source
J'ai récemment essayé quelque chose comme ça, en utilisant "optparse".
Je l'ai configuré comme sous-classe d'OptonParser, avec une commande «--Store» et une commande «--Check».
Le code ci-dessous devrait à peu près vous couvrir. Vous avez juste besoin de définir vos propres méthodes 'load' et 'store' qui acceptent / retournent des dictionnaires et vous êtes une proie bien définie.
la source
Pour répondre à toutes ces exigences, je recommanderais d'écrire votre propre bibliothèque qui utilise à la fois [opt | arg] parse et configparser pour la fonctionnalité sous-jacente.
Compte tenu des deux premières et de la dernière exigence, je dirais que vous voulez:
Première étape: effectuez une passe d'analyseur de ligne de commande qui ne recherche que l'option --config-file.
Deuxième étape: analysez le fichier de configuration.
Troisième étape: configurez une deuxième passe d'analyseur de ligne de commande en utilisant la sortie de la passe du fichier de configuration comme valeur par défaut.
La troisième exigence signifie probablement que vous devez concevoir votre propre système de définition d'options pour exposer toutes les fonctionnalités d'optparse et de configparser qui vous intéressent, et rédiger un peu de plomberie pour effectuer des conversions entre les deux.
la source
Voici un module que j'ai piraté ensemble qui lit les arguments de ligne de commande, les paramètres d'environnement, les fichiers ini et les valeurs de trousseau de clés. Il est également disponible dans un résumé .
la source
Vous pouvez utiliser ChainMap pour cela. Jetez un œil à mon exemple que j'ai fourni dans "Quelle est la meilleure façon d'autoriser le remplacement des options de configuration sur la ligne de commande en Python?" Alors question.
la source
Le confect de bibliothèque que j'ai construit est précisément pour répondre à la plupart de vos besoins.
Il peut attacher des options de ligne de commande à certaines commandes de clic
(désolé, ce n'est pas argparse, mais le clic est meilleur et beaucoup plus avancé.
confect
pourrait prendre en charge argparse dans la prochaine version).confect
charge les fichiers de configuration Python et non JSON / YMAL / TOML / INI. Tout comme le fichier de profil IPython ou le fichier de paramètres DJANGO, le fichier de configuration Python est flexible et plus facile à gérer.Pour plus d'informations, veuillez consulter le README.rst dans le référentiel du projet . Sachez qu'il ne prend en charge que Python3.6 up.
Exemples
Joindre des options de ligne de commande
Il crée automatiquement un message d'aide complet avec toutes les propriétés et valeurs par défaut déclarées.
Chargement des variables d'environnement
Il suffit d'une seule ligne pour charger les variables d'environnement
la source