Python ConfigParser KeyError:

3
我正在按照以下链接中的示例读取配置文件:https://wiki.python.org/moin/ConfigParserExamples,但是我遇到了一个KeyError错误,无法弄清楚原因。它可以读取文件,我甚至可以打印出各个部分,但我认为我做了一些非常愚蠢的事情。非常感谢任何帮助。

以下是代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import ConfigParser
import logging

config_default=ConfigParser.ConfigParser()

class Setting(object):
    
    def get_setting(self, section, my_setting):
        
        default_setting = self.default_section_map(section)[my_setting]

        return default_setting

    def default_section_map(self,section):
        dict_default = {}
                
        config_default.read('setting.cfg')
        sec=config_default.sections()

        options_default = config_default.options(section)
        
        logging.info('options_default: {0}'.format(options_default))
        
        for option in options_default:
            try:
                dict_default[option] = config_default.get(section, option)

                if dict_default[option] == -1:
                    print("skip: %s" % option)
            except:
                print("exception on %s!" % option)
                dict_default[option] = None

            return dict_default

        return complete_path

if __name__ == '__main__':

    conf=Setting()
    
    host=conf.get_setting('mainstuff','name')
    #host=conf.setting

    print 'host setting is :' + host

我的配置文件名为setting.cfg,内容如下:

[mainstuff]
name              = test1
domain              = test2

[othersection]
database_ismaster   = no
database_master     = test3
database_default    = test4

[mysql]
port                = 311111
user                = someuser
passwd              = somecrazylongpassword

[api]
port                = 1111

错误信息如下...

域名异常!追踪到最近的调用:在"./t.py"文件中第51行,执行以下代码:

host=conf.get_setting('mainstuff','name')

但是,在"./t.py"文件中第14行,获取默认设置时出现了错误:

default_setting = self.default_section_map(section)[my_setting]

KeyError: 'name'


在我的情况下,配置文件是使用相对路径读取的,而我的开发环境正在从不同的目录执行脚本,因此根本找不到配置文件。当我自己运行它时,它可以正常工作,但我一开始没有意识到我的IDE在做什么。 - ADJenks
4个回答

3

请确保你的完整文件路径为setting.cfg。如果你将文件放在其他文件夹中或者文件名不同,Python会报告相同的KeyError


2

您没有常规部分。为了获取主机名,您需要类似以下的内容:

[general]
hostname =  'hostname.net'

在您的setting.cfg文件中。现在您的配置文件与程序匹配 - 也许您更喜欢调整您的程序以匹配配置文件?...这至少可以让您开始。

更新:

由于我的答案现在已经无用了,这里有一些您可以尝试构建的东西(假设它对您有效...)

import ConfigParser

class Setting(object):

    def __init__(self, cfg_path):
        self.cfg = ConfigParser.ConfigParser()
        self.cfg.read(cfg_path)

    def get_setting(self, section, my_setting):
        try:        
            ret = self.cfg.get(section, my_setting)
        except ConfigParser.NoOptionError:
            ret = None
        return ret


if __name__ == '__main__':

    conf=Setting('setting.cfg')
    host = conf.get_setting('mainstuff', 'name')
    print 'host setting is :', host

嗨@hiro protagonist,感谢您的回答。问题是我在发布这段代码时忘记更改了。我更改了配置文件以避免过多地暴露信息。因此,我现在已经像这样更新了上面的代码'host=conf.get_setting('mainstuff','name')',只是为了确认它仍然会出现相同的错误。对此我很抱歉。 - whoopididoo
嗯...对我来说可以。 (顺便说一下:在您的原始代码中未定义complete_path。) - hiro protagonist
你可以尝试使用print self.default_section_map(section)来进行调试,这应该会有所帮助... - hiro protagonist
哦,我以为那就是问题所在了,'complete_path' 不应该在那里。我把它拿掉了,但还是出现同样的错误。如果这个对你有效,我就不知道到底是怎么回事了。 - whoopididoo
域名异常! {'domain': None} 域名异常! 跟踪(Traceback)(最近的调用在最后一行): 文件 "./t.py",行 53,in <module> host=conf.get_setting('mainstuff','name') 文件 "./t.py",行 15,in get_setting default_setting = self.default_section_map(section)[my_setting] KeyError: 'name' - whoopididoo
显示剩余2条评论

0

这个错误主要有两个原因:

  1. 由于没有获取正确的路径,导致无法读取配置文件。可以使用绝对路径。首先尝试读取配置文件以查看是否有任何问题。

    f = open("config.ini", "r")

    print(f.read())

  2. 在配置文件中找不到所提到的部分


在这种情况下,我使用了 config.read(os.path.dirname(os.path.abspath(__file__))+"/../conf/general.conf") 来引用完整路径,并且它对我起作用了。 - Angel Angeles

0
在我的情况下,问题是配置文件名区分大小写。而不是setting.cfg,应该是setting.CFG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接