Question

J'ai un problème. Mon programme utilise le fichier de configuration pour définir les options, et une de ces options est un tuple. Voici ce que je veux dire:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/

etc ... Puis-je analyser cela en tuple avec le module ConfigParser en Python? Est-il un moyen facile de le faire?

Était-ce utile?

La solution

si vous pouvez modifier le format de configuration comme ceci:

folder = /home/scorpil
         /media/sda5/
         /media/sdb5/

puis en python:

config.get("common", "folder").split("\n")

Autres conseils

Votre config pourrait être:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder = ("/home/scorpil", "/media/sda5/", "/media/sdb5/")

En supposant que vous avez config dans un fichier nommé foo.cfg, vous pouvez faire ce qui suit:

import ConfigParser
cp = ConfigParser.ConfigParser()
cp.read("foo.cfg")
folder = eval(cp.get("common", "folder"), {}, {})

print folder
print type(folder)

qui devrait produire:

  

( '/ home / scorpil', '/ media / sda5 /', '/ media / sdb5 /')
  

- EDIT - Je l'ai depuis changé d'avis à ce sujet, et je prends la position aujourd'hui que l'utilisation eval dans ce contexte est une mauvaise idée. Même avec un environnement restreint, si le fichier de configuration est sous le contrôle de l'utilisateur, il peut être une très mauvaise idée. Aujourd'hui, je vous recommande sans doute faire quelque chose d'intéressant pour éviter l'exécution fendu de code malveillant.

Vous pouvez obtenir la liste des articles et utiliser une compréhension de liste pour créer une liste de tous les éléments qui commence avec le nom d'un préfixe défini, dans votre cas dossier

folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])

Créer configuration:

folders = ['/home/scorpil', '/media/sda5/', '/media/sdb5/']
config.set('common', 'folders', json.dumps(folders))

Configuration de la charge:

tuple(json.loads(config.get('common', 'folders')))

Je ne sais pas ConfigParser, mais vous pouvez facilement lire dans une liste (peut-être à l'aide .append()) puis faire myTuple = tuple(myList)

#!/usr/bin/env python
sample = """
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/
"""
from cStringIO import StringIO
import ConfigParser
import re
FOLDER_MATCH = re.compile(r"folder\[(\d+)\]$").match

def read_list(items,pmatch=FOLDER_MATCH):
    if not hasattr(pmatch,"__call__"):
        pmatch = re.compile(pmatch).match
    folder_list = []
    for k,v in items:
        m = pmatch(k)
        if m:
            folder_list.append((int(m.group(1)),v))
    return tuple( kv[1] for kv in sorted(folder_list) )


if __name__ == '__main__':
    cp = ConfigParser.SafeConfigParser()
    cp.readfp(StringIO(sample),"sample")

    print read_list(cp.items("common"))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top