Domanda

Ho un problema. Il mio programma sta utilizzando file di configurazione per impostare le opzioni e una di queste opzioni è una tupla. Ecco cosa voglio 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/

ecc ... Posso analizzare questo in tupla con modulo ConfigParser in Python? C'è qualche modo semplice per fare questo?

È stato utile?

Soluzione

se è possibile modificare il formato di configurazione in questo modo:

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

poi in python:

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

Altri suggerimenti

Il tuo config potrebbe essere:

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

Supponendo di avere config in un file chiamato foo.cfg, è possibile effettuare le seguenti operazioni:

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

print folder
print type(folder)

che dovrebbe produrre:

  

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

- EDIT - Da allora ho cambiato idea su questo, e che avrebbe preso la posizione di oggi che usando eval in questo contesto è una cattiva idea. Anche con un ambiente ristretto, se il file di configurazione è sotto il controllo dell'utente potrebbe essere una pessima idea. Oggi probabilmente sarei consiglia di fare qualcosa di interessante con spacco per evitare l'esecuzione di codice dannoso.

È possibile ottenere l'elenco oggetti e utilizzare una lista di comprensione per creare un elenco di tutti gli elementi che inizia con un prefisso definito nome, nel vostro caso cartella

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

Crea configurazione:

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

Carica configurazione:

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

Non so ConfigParser, ma si può facilmente leggere in un elenco (magari utilizzando .append()) e poi fare 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"))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top