2013-05-06 14 views
5

Sto creando un preventivo del server del giorno. Sto leggendo le opzioni da un file INI, il cui testo è di seguito:Python - ConfigParser - AttributeError: l'istanza di ConfigParser non ha attributo '__getitem__'

[Server] 
host = 
port = 17 

[Quotes] 
file=quotes.txt 

Tuttavia, quando uso ConfigParser, mi dà questo errore:

Traceback (most recent call last): 
    File "server.py", line 59, in <module> 
    Start() 
    File "server.py", line 55, in Start 
    configOptions = parseConfig(filename) 
    File "server.py", line 33, in parseConfig 
    server = config['Server'] 
AttributeError: ConfigParser instance has no attribute '__getitem__' 

Ecco il mio codice:

#!/usr/bin/python 

from socket import * 
from ConfigParser import * 
import sys 

class serverConf: 
    port = 17 
    host = "" 
    quotefile = "" 

def initConfig(filename): 


    config = ConfigParser() 

    config['Server'] = {'port': '17', 'host': ''} 
    config['Quotes'] = {'file': 'quotes.txt'} 

    with open(filename, 'w') as configfile: 
     config.write(configfile) 


def parseConfig(filename): 

    configOptions = serverConf() 



    config = ConfigParser() 
    config.read(filename) 

    server = config['Server'] 

    configOptions.port = int(server['port']) 
    configOptions.host = conifg['Server']['host'] 
    configOptions.quoteFile = config['Quotes']['file'] 



    print "[Info] Read configuration options" 

    return configOptions 

def doInitMessage(): 

    print "Quote Of The Day Server" 
    print "-----------------------" 
    print "Version 1.0 By Ian Duncan" 
    print "" 

def Start(): 

    filename = "qotdconf.ini" 
    configOptions = parseConfig(filename) 

    print "[Info] Will start server at: " + configOptions.host + ":" + configOptions.port 

Start() 

Perché sto ricevendo questo errore e cosa posso fare per risolverlo?

+1

Le staffe non funzioneranno. Usa la funzione 'get()'. 'configOptions.host = conifg.get ('Server', 'host')' http://docs.python.org/2/library/configparser.html#examples – M456

+0

Bene, stai cercando di usare 'config' come se fosse un dizionario, e non lo è, è un'istanza di' ConfigParser' ... – kindall

+0

In futuro, potresti voler fare riferimento alla ['Documentazione di ConfigParser'] (http://docs.python.org /2/library/configparser.html#configparser-objects). –

risposta

10

Dopo una rapida lettura sembra che si sta cercando di leggere i dati come se si tratta di un dizionario, quando si dovrebbe usare: config.get(section, data)

EG:

... 
config = ConfigParser() 
config.read(filename) 
... 
configOptions.port = config.getint('Server', 'port') 
configOptions.host = config.get('Server', 'host') 
configOptions.quoteFile = config.get('Quotes', 'file') 

di scrivere ai config- File si potrebbe fare qualcosa di simile:

... 
def setValue(parser, sect, index, value): 
    cfgfile = open(filename, 'w') 
    parser.set(sect, index, value) 
    parser.write(cfgfile) 
    cfgfile.close() 
+0

Devo aver letto la guida su qualche sito web errata, perché pensavo che dicesse di utilizzare parentesi angolari. – Igor

+0

È possibile utilizzare i documenti python: http://docs.python.org/2/library/configparser.html – JHolta

+12

Questa è la differenza tra la versione python 3 di configparser e la versione pyhton 2.7 del configparser. in Python 3.3, questo è quello che faresti normalmente. – chiffa

1

La ConfigParser incluso con Python 2.7 non funziona in questo modo. Puoi, tuttavia, ottenere esattamente ciò che hai proposto utilizzando il modulo configparser back ported available on PyPy.

pip install configparser 

Quindi è possibile utilizzare proprio come si farebbe in Python 3 *

from configparser import ConfigParser 
parser = ConfigParser() 
parser.read("settings.ini") 
# or parser.read_file(open("settings.ini")) 
parser['Server']['port'] 
# '17' 
parser.getint('Server', 'port') 
# 17 

NOTA

  • configparser non è al 100% compatibile con la versione di Python 3.
  • Il backport ha lo scopo di mantenere la compatibilità al 100% con la versione di vanilla in Python 3.2+.
  • Usandolo in questo modo visualizzato sopra, sarà l'implementazione predefinita di Python 3 se disponibile.
Problemi correlati