66 votes

Fichier de configuration Python : Une recommandation sur le format du fichier ? Le format INI est-il toujours approprié ? Cela semble assez vieux jeu

J'ai besoin de stocker des configurations (clé/valeur) pour une application Python et je cherche la meilleure façon de stocker ces configurations dans un fichier.

Je me heurte au problème de Python ConfigParser et je me suis demandé si le format de fichier INI est vraiment encore approprié de nos jours ! Existe-t-il un format plus actuel ou le format INI est-il toujours recommandé ? (XML, JSON, ...)

Veuillez partager vos opinions/recommandations...

7 votes

Je pense que INI est très bien si vous stockez juste une liste de paires clé-valeur !

0 votes

Il y a aussi le type d'objet dict avec une étagère. Mais c'est peut-être un peu trop.

0 votes

@Matt : Je pense qu'il est facile à utiliser, probablement plus facile que d'utiliser le système de gestion de l'information. ConfigParser

67voto

codeape Points 38576

Pensez à utiliser des fichiers Python simples comme fichiers de configuration.

Un exemple ( config.py ) :

# use normal python comments

value1 = 32
value2 = "A string value"

value3 = ["lists", "are", "handy"]
value4 = {"and": "so", "are": "dictionaries"}

Dans votre programme, chargez le fichier de configuration en utilisant exec ( docs ) :

from pathlib import Path

if __name__ == "__main__":
    config = {}
    exec(Path("config.py").read_text(encoding="utf8"), {}, config)

    print(config["value1"])
    print(config["value4"])

J'aime cette approche, pour les raisons suivantes :

  • Dans le cas simple, le format est aussi facile à créer qu'un fichier de configuration de type INI. Il partage également une caractéristique importante avec les fichiers INI : il convient parfaitement au contrôle de version (c'est moins vrai pour XML et peut-être aussi pour JSON).
  • J'aime la flexibilité qui découle du fait d'avoir le fichier de configuration dans un langage de programmation réel.

L'approche est largement utilisée, quelques exemples :

  • Les paramètres d'un site Django se trouvent dans paramètres.py . Django n'utilise pas execfile il utilise import pour lire/exécuter settings.py AFAIK, mais le résultat final est le même : le code contenu dans le fichier de paramètres est exécuté.
  • Le shell bash lit et exécute ~/.bashrc au démarrage.
  • L'interpréteur Python importe site.py au démarrage.

0 votes

Je ne suis pas un expert en sécurité, mais je suppose que si le programme s'exécute avec les privilèges de Root, mais que le fichier de configuration se trouve dans l'espace utilisateur, un utilisateur pourrait facilement faire exécuter un code dangereux en tant que Root.

10 votes

Si le programme s'exécute avec les privilèges de Root, le fichier de configuration doit avoir des droits d'écriture réservés à Root.

2 votes

Je n'aime pas vraiment ça. Le site setup.py dans distutils a été modifié en un format déclaratif pour éviter qu'il ne soit trop complexe. Cela ouvre des possibilités d'abus (instructions if, etc.). Cependant, si vous deviez analyser le fichier en utilisant la commande ast et n'autoriser que les affectations simples, cela pourrait fonctionner.

34voto

mac Points 16282

INI est toujours tout à fait OK et comme d'autres l'ont dit, le format de votre fichier de configuration dépend vraiment de la façon dont vous allez l'utiliser.

Personnellement, je suis un fan de YAML : concis, lisible, flexible.

Google semble partager mon enthousiasme, puisqu'ils l'utilisent également dans le Google App Engine. Le parseur python est aquí .

13 votes

L'inconvénient de YAML est que vous avez besoin d'une dépendance supplémentaire pour l'analyser.

9voto

Matt Points 3357

Dictionnaires sont également très populaires. Il s'agit essentiellement d'une table de hachage.

{"one": 1, "two": 2} est un exemple, qui ressemble un peu à json.

Ensuite, vous pouvez l'appeler comme suit mydict["one"] ce qui donnerait 1.

Vous pouvez alors utiliser mettre en rayon pour enregistrer le dictionnaire dans un fichier :

mydict = shelve.open(filename)
# then you can call it from there, like
mydict["one"]

Donc, c'est un peu plus facile qu'un fichier ini. Vous pouvez ajouter des choses comme une liste ou changer des options assez facilement, et une fois que vous fermez le fichier, il le réécrit.

Voici un exemple simple de ce que je veux dire :

import shelve

def main():
    mydict = shelve.open("testfile")
    mydict["newKey"] = value("some comment", 5)
    print(mydict["newKey"].value)
    print(mydict["newKey"].comment)
    mydict.close()

class value():
    def __init__(self, comment, value):
        self.comment = comment
        self.value = value

if __name__ == '__main__':
    main()

0 votes

Je suppose que le commentaire fait pour json est également valable ici : Aucun commentaire possible !

0 votes

@gecoo pas tout à fait. Vous pouvez stocker un objet dans un dictionnaire. Donc, vous pouvez toujours stocker la valeur en tant qu'objet et avoir un commentaire à l'intérieur. Ce n'est donc pas exactement comme json.

0 votes

@geeco j'ai mis à jour ma réponse avec un exemple de code simple. Ce ne sera pas en texte clair, donc si vous voulez le regarder, ce ne sera pas facile à lire. Tout dépend de ce que vous recherchez.

8voto

Constantinius Points 13708

Cela dépend entièrement de vos besoins. Si (comme vous le dites) vous n'avez besoin que de paires clé/valeur, les fichiers ini (ou d'autres fichiers de configuration "ordinaires") vous conviendront parfaitement. Non, ils ne sont pas dépassés, car ils sont toujours utilisés.

XML/JSON est parfait si vous avez des structures hiérarchiques et si vous souhaitez également utiliser des méthodes plus sophistiquées (par exemple, la validation des fichiers XML, les espaces de noms, etc.)

13 votes

Je vous déconseille d'utiliser JSON, car (au moins avec l'analyseur json de Python) vous ne pouvez pas avoir de commentaires dans JSON.

5voto

Silver Light Points 9397

Cela dépend de la façon dont le fichier de configuration sera utilisé.

L'un des avantages des fichiers INI est qu'ils sont vraiment faciles à lire et à comprendre. Il est beaucoup plus facile de faire une erreur dans un fichier JSON ou XML si vous éditez la configuration à la main. PHP utilise toujours les fichiers INI.

Cependant, si votre configuration n'est pas destinée à être modifiée à la main, choisissez le format que vous voulez, car INI n'est pas le plus facile à analyser.

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