web-dev-qa-db-fra.com

Quelle est la manière officielle de stocker les paramètres des programmes python?

Django utilise de vrais fichiers Python pour les paramètres, Trac utilise un fichier .ini et certains autres logiciels utilisent des fichiers XML pour contenir ces informations.

Est-ce que l'une de ces approches est bénie par Guido et/ou la communauté Python plus qu'une autre?

50
Steven Hepting

Dépend du public cible prédominant.

Si ce sont des programmeurs qui changent le fichier de toute façon, utilisez simplement python fichiers comme settings.py

Si ce sont les utilisateurs finaux, pensez aux fichiers ini.

32
Lakshman Prasad

Comme beaucoup l'ont dit, il n'y a pas de voie "officielle". Il existe cependant de nombreux choix. Il y a eu ne conférence à PyCon cette année à propos de nombreuses options disponibles.

30
brianz

Je ne sais pas si cela peut être considéré comme "officiel", mais c'est dans la bibliothèque standard: 14.2. ConfigParser - Analyseur de fichier de configuration .

Ce n'est évidemment pas une solution universelle, cependant. Utilisez simplement ce qui vous semble le plus approprié à la tâche, sans aucune complexité nécessaire (et - en particulier - Turing-exhausteness! Pensez aux configurateurs automatiques ou GUI).

15
drdaeman

J'utilise une étagère ( http://docs.python.org/library/shelve.html ):

shelf = shelve.open(filename)
shelf["users"] = ["David", "Abraham"]
shelf.sync() # Save
14
Moshe Revah

Encore une option, PyQt. Qt a un moyen indépendant de la plate-forme de stocker les paramètres avec la classe QSettings. Sous le capot, sur Windows, il utilise le registre et sous Linux, il stocke les paramètres dans un fichier de configuration caché. QSettings fonctionne très bien et est assez simple.

9
jhufford

Je ne suis pas sûr qu'il existe une méthode "officielle" (elle n'est pas mentionnée dans le Zen de Python :)) - j'ai tendance à utiliser le module Config Parser moi-même et je pense que vous le ferez trouver cela assez commun. Je préfère cela à l'approche du fichier python parce que vous pouvez y réécrire et recharger dynamiquement si vous le souhaitez.

6
Shane C. Mason

Il n'y a pas de solution bénie pour autant que je sache. Il n'y a pas de bonne ou de mauvaise façon de stocker les paramètres de l'application non plus, xml, json ou tous les types de fichiers sont parfaits tant que vous êtes à l'aise. Pour python J'utilise personnellement pypref c'est très facile, multiplateforme et simple.

pypref est très utile car on peut stocker des paramètres et des préférences statiques et dynamiques ...

    from pypref import Preferences

    #  create singleton preferences instance
    pref = Preferences(filename="preferences_test.py")

    # create preferences dict
    pdict = {'preference 1': 1, 12345: 'I am a number'}

    # set preferences. This would automatically create preferences_test.py 
    # in your home directory. Go and check it.
    pref.set_preferences(pdict)

    # lets update the preferences. This would automatically update 
    # preferences_test.py file, you can verify that. 
    pref.update_preferences({'preference 1': 2})

    # lets get some preferences. This would return the value of the preference if
    # it is defined or default value if it is not.
    print pref.get('preference 1')

    # In some cases we must use raw strings. This is most likely needed when
    # working with paths in a windows systems or when a preference includes
    # especial characters. That's how to do it ...
    pref.update_preferences({'my path': " r'C:\Users\Me\Desktop' "})

    # Sometimes preferences to change dynamically or to be evaluated real time.
    # This also can be done by using dynamic property. In this example password
    # generator preference is set using uuid module. dynamic dictionary
    # must include all modules name that must be imported upon evaluating
    # a dynamic preference
    pre = {'password generator': "str(uuid.uuid1())"}
    dyn = {'password generator': ['uuid',]}
    pref.update_preferences(preferences=pre, dynamic=dyn)

    # lets pull 'password generator' preferences twice and notice how
    # passwords are different at every pull
    print pref.get('password generator')
    print pref.get('password generator')

    # those preferences can be accessed later. Let's simulate that by creating
    # another preferences instances which will automatically detect the 
    # existance of a preferences file and connect to it
    newPref = Preferences(filename="preferences_test.py")

    # let's print 'my path' preference
    print newPref.get('my path')
6
Cobry

Cela dépend en grande partie de la complexité de votre configuration. Si vous faites un simple mappage de valeurs-clés et que vous souhaitez pouvoir modifier les paramètres avec un éditeur de texte, je pense que ConfigParser est la solution.

Si vos paramètres sont compliqués et incluent des listes et des structures de données imbriquées, j'utiliserais XML ou JSON et créerais un éditeur de configuration.

Pour les choses vraiment compliquées où l'utilisateur final ne devrait pas beaucoup changer les paramètres, ou est plus fiable, créez simplement un ensemble de classes Python et évaluez un script Python pour obtenir le configuration.

4
Kamil Kisiel

L'une des façons les plus simples d'utiliser est d'utiliser le module json. Enregistrez le fichier dans config.json avec les détails indiqués ci-dessous.

Enregistrement des données dans le fichier json:

{

    "john"  : {
        "number" : "948075049" , 
        "password":"thisisit" 
    }    
}

Lecture du fichier json:

import json

#open the config.json file 

with open('config.json') as f:
    mydata = json.load(f) ; 

#Now mydata is a python dictionary 

print("username is " , mydata.get('john').get('number') , " password is " , mydata.get('john').get('password')) ;
3
Natesh bhat

Pour les applications Web, j'aime utiliser les variables d'environnement du système d'exploitation: os.environ.get('CONFIG_OPTION')

Cela fonctionne particulièrement bien pour les paramètres qui varient entre les déploiements. Vous pouvez en savoir plus sur la raison d'être de l'utilisation des vars env ici: http://www.12factor.net/config

Bien sûr, cela ne fonctionne que pour les valeurs en lecture seule car les modifications apportées à l'environnement ne sont généralement pas persistantes. Mais si vous n'avez pas besoin d'un accès en écriture, c'est une très bonne solution.

2
dbader

pourquoi Guido aurait-il béni quelque chose qui est hors de sa portée? Non, il n'y a rien de particulièrement béni.

0
SilentGhost

C'est plus de commodité. Il n'y a aucun moyen officiel de dire. Mais l'utilisation de fichiers XML aurait du sens car ils peuvent être manipulés par diverses autres applications/bibliothèques.

0
Checksum