2013-05-06 12 views
5

Tworzę cytat z serwera dnia. Czytam opcje z pliku INI, którego tekst znajduje się poniżej:Python - ConfigParser - AttributeError: Instancja ConfigParser nie ma atrybutu "__getitem__"

[Server] 
host = 
port = 17 

[Quotes] 
file=quotes.txt 

Jednak kiedy używam ConfigParser, to daje mi ten błąd:

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__' 

Oto mój kod:

#!/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() 

Dlaczego pojawia się ten błąd i co mogę zrobić, aby go naprawić?

+1

Wsporniki nie będą działać. Użyj funkcji 'get()'. 'configOptions.host = conifg.get ('Server', 'host')' http://docs.python.org/2/library/configparser.html#examples – M456

+0

Cóż, próbujesz użyć 'config' tak, jakby był słownikiem, a nie jest, jest instancją' ConfigParser' ... – kindall

+0

W przyszłości możesz odwołać się do dokumentacji '' ConfigParser'' (http://docs.python.org /2/library/configparser.html#configparser-objects). –

Odpowiedz

10

Po szybkim czytać wydaje się, że starasz się odczytać danych, jak gdyby to słownik, kiedy należy użyć: config.get(section, data)

np

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

zapisu config- plik może zrobić coś takiego:

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

Musiałem przeczytać przewodnik na jakiejś stronie internetowej, ponieważ myślałem, że mówi się używać nawiasów trójkątnych. – Igor

+0

Możesz użyć dokumentacji Pythona: http://docs.python.org/2/library/configparser.html – JHolta

+12

To jest różnica między wersją configparser w python 3 a wersją configshtard 2.7. w Pythonie 3.3 jest to normalne działanie. – chiffa

1

Dołączony ConfigParser z Pythona 2.7 nie działa w ten sposób. Możesz jednak osiągnąć dokładnie to, co zaproponowałeś, korzystając z przeniesionego z powrotem modułu configparseravailable on PyPy.

pip install configparser 

Wtedy można go używać tak samo jak w Pythonie 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 

UWAGA

  • configparser nie jest w 100% kompatybilny z wersją Pythona 3.
  • Backport ma zachować 100% kompatybilność z wersją waniliową w Pythonie 3.2+.
  • Używanie tego w powyższym fasonie spowoduje domyślne zastosowanie wersji Python 3, jeśli jest dostępna.