2013-05-06 27 views
5

Gün sunucusunun bir teklifini oluşturuyorum. Kimin metin bir INI dosyası, gelen seçenekleri okuyorum aşağıdaki gibidir:Python - ConfigParser - AttributeError: ConfigParser örneğinin '__getitem__' özniteliği yok

[Server] 
host = 
port = 17 

[Quotes] 
file=quotes.txt 

Ancak, ben ConfigParser kullandığınızda, bana bu hata veriyor:

#!/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() 
: Burada
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__' 

benim kodudur

Neden bu hatayı alıyorum ve düzeltmek için ne yapabilirim? Hızlı bir sonra

+1

Parantez çalışmaz. 'Get()' işlevini kullanın. 'configOptions.host = conifg.get ('Sunucu', 'ana bilgisayar')' http://docs.python.org/2/library/configparser.html#examples – M456

+0

Kullanmaya çalışıyorsunuz 'bir yapılandırma sözdeymiş gibi yapılandırılmamış', 'bir ConfigParser' örneği ... – kindall

+0

Gelecekte, ['ConfigParser' belgelerine] başvurmak isteyebilirsiniz (http://docs.python.org /2/library/configparser.html#configparser-objects). –

cevap

10

bunu bir sözlük var sanki veri okumak için çalışıyoruz gibi görünüyor okumak, kullanmak gerekirken: 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') 

config- yazmak için Eğer böyle bir şey yapabileceğini file:

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

'da çalışırdı. Bazı web sitesinde yanlış olan kılavuzu okudum çünkü açılı ayraç kullanacağını düşündüm. – Igor

+0

Python belgelerini kullanabilirsiniz: http://docs.python.org/2/library/configparser.html – JHolta

+12

Bu, configparser'ın python 3 sürümü ve configparser'ın pyhton 2.7 sürümü arasındaki farktır. python 3.3'te, normalde yaptığınız şey budur. – chiffa

1

piton 2.7 ile birlikte ConfigParser bu şekilde çalışmaz. Bununla birlikte, configparser modülü available on PyPy modülünü kullanarak önerdiğiniz şeyi tam olarak başarabilirsiniz.

pip install configparser 

Sonra sadece olarak kullanabilirsiniz yapacağınız

  • configparser Python 3 sürümü ile uyumlu% 100 değildir NOT *

    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 
    

    Python 3'te.

  • Backport, Python 3.2+ sürümündeki vanilla sürümü ile% 100 uyumluluk sağlamayı amaçlamaktadır.
  • Yukarıda gösterilen bu şekilde kullanmak, varsa, varsayılan olarak Python 3 uygulamasına geçer.