402 votes

Quelle est la meilleure pratique pour utiliser un fichier de paramètres en Python ?

J'ai une ligne de commande script que j'exécute avec beaucoup d'arguments. Je suis maintenant arrivé à un point où j'ai trop d'arguments, et je veux avoir certains arguments sous forme de dictionnaire aussi.

Donc, afin de simplifier les choses, je voudrais exécuter le script avec un fichier de paramètres à la place. Je ne sais pas vraiment quelles bibliothèques utiliser pour l'analyse du fichier. Quelle est la meilleure pratique pour faire cela ? Je pourrais bien sûr élaborer quelque chose moi-même, mais s'il existe une bibliothèque pour cela, je suis tout ouïe.

Quelques "demandes" :

  • Plutôt que d'utiliser pickle J'aimerais qu'il s'agisse d'un fichier texte simple qui puisse être lu et modifié facilement.
  • Je veux pouvoir y ajouter des données de type dictionnaire, c'est-à-dire qu'une certaine forme d'imbrication doit être prise en charge.

Un fichier de pseudo-exemple simplifié :

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2

7 votes

La syntaxe particulière de cet exemple de fichier est en fait YAML, consultez la réponse de Benson.

0 votes

Je suggère d'utiliser python-box voir ceci réponse .

3 votes

Cette question est vraiment utile (il suffit de regarder le nombre de votes positifs) ; pourquoi la fermer ?

257voto

dugres Points 3239

Vous pouvez avoir un module Python ordinaire, disons config.py, comme ceci :

truck = dict(
    color = 'blue',
    brand = 'ford',
)
city = 'new york'
cabriolet = dict(
    color = 'black',
    engine = dict(
        cylinders = 8,
        placement = 'mid',
    ),
    doors = 2,
)

et l'utiliser comme ceci :

import config
print(config.truck['color'])

83 votes

C'est une assez mauvaise idée, car si vous voulez permettre à des utilisateurs peu privilégiés de ne pouvoir modifier que les fichiers de configuration, vous leur permettez essentiellement d'introduire en douce du code privilégié.

184 votes

Permettre à des utilisateurs "peu privilégiés" de modifier la configuration d'un programme plus privilégié est probablement une configuration discutable de toute façon.

2 votes

Cela n'offre aucune protection contre les utilisateurs "peu privilégiés" qui modifient la configuration. Si vous importez le module au début d'un script, changez la valeur d'une des variables et importez le reste des modules, vous pouvez modifier les valeurs de configuration même si vous n'avez pas la permission d'écrire le fichier de configuration.

218voto

Benson Points 10705

L'exemple de configuration que vous avez fourni est en fait valide YAML . En fait, YAML répond à toutes vos exigences, est implémenté dans un grand nombre de langues et est extrêmement convivial. Je vous recommande vivement de l'utiliser. Le site Projet PyYAML fournit un module python sympa, qui implémente YAML.

L'utilisation du module yaml est extrêmement simple :

import yaml
config = yaml.safe_load(open("path/to/config.yml"))

5 votes

Je me tourne toujours vers yaml ; le format peut aller du plus simple au support d'un code python intégré, et la bibliothèque standard fait le gros du travail d'analyse et de désinfection pour vous.

20 votes

D'accord. Pour vous ou les utilisateurs qui écrivent YAML, voici la meilleure référence YAML que je connaisse . Le site documentation officielle est malheureusement une spécification destinée aux exécutants, et rien d'autre, mais le guide d'Eevee est fantastique.

7 votes

Pour nous les non-initiés, c'est pip3 install pyyaml pour le rendre prêt à être importé dans python scripts.

63voto

Anoop Points 653

Yaml et Json sont les formats de fichiers les plus simples et les plus couramment utilisés pour stocker les paramètres/configurations. PyYaml peut être utilisé pour analyser le yaml. Json fait déjà partie de python depuis la version 2.5. Yaml est un sur-ensemble de Json. Json résoudra la plupart des cas d'utilisation à l'exception des chaînes de caractères multi-lignes où l'échappement est nécessaire. Yaml s'occupe également de ces cas.

>>> import json
>>> config = {'handler' : 'adminhandler.py', 'timeoutsec' : 5 }
>>> json.dump(config, open('/tmp/config.json', 'w'))
>>> json.load(open('/tmp/config.json'))   
{u'handler': u'adminhandler.py', u'timeoutsec': 5}

15 votes

Bien que plus ou moins équivalent, json est loin d'être aussi lisible que yaml. Puisque son exemple de configuration est en fait un yaml valide, je mettrais l'accent sur ce format plutôt que sur le json.

26 votes

L'utilisation de "json.dump(config, fp, sort_keys=True, indent=4)" améliore la lisibilité.

50voto

JoshAdel Points 15911

Vérifiez :

http://wiki.python.org/moin/ConfigParserShootout

pour obtenir une liste des analyseurs de configuration disponibles en python. Certains supportent les fichiers de configuration imbriqués.

3voto

Eric Fortin Points 5307

Jetez un coup d'œil à analyseur de configuration standard python .

EDIT : Puisque l'imbrication semble être si importante, vous pourriez envisager de gérer votre fichier de configuration au format JSON.

Il s'agit alors d'utiliser le json module avec dumps y loads qui fonctionnent avec des dictionnaires imbriqués à n'importe quel niveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X