Python ConfigParser KeyError:

Python ConfigParser KeyError:

我正在按照示例从以下内容读取配置文件 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

错误是这样的...

exception on domain! Traceback (most recent call last): File "./t.py", line 51, in host=conf.get_setting('mainstuff','name') File "./t.py", line 14, in get_setting default_setting = self.default_section_map(section)[my_setting] KeyError: 'name'

您没有 general 部分。为了获得主机名,您需要

[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

确保您的完整文件路径是 'setting.cfg'。如果您将文件放在其他文件夹或命名不同,Python 将报告相同的 KeyError

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

  1. 由于未获得正确的路径,导致读取配置文件时出现问题。可以使用绝对路径。尝试先读取配置文件是否有任何问题。

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

    print(f.read())

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