我编写了一个代码,其中参数来自配置文件。 配置中的第一个参数是设置调试级别。
config = ConfigParser.RawConfigParser()
config.read('config.cfg')
log_level = config.get('Logger','log_level' )
配置中还有其他部分,它们提供服务器IP和密码来扫描每个部分。
主要代码:
for section in config.sections():
components = dict() #start with empty dictionary for each section
env.user = config.get(section, 'server.user_name')
env.password = config.get(section, 'server.password')
host = config.get(section, 'server.ip')
从我的配置
[Logger]
#Possible values for logging are INFO, DEBUG and ERROR
log_level = DEBUG
[server1]
server.user_name = root
server.password = password
server.ip = 172.19.41.21
[server2]
server.user_name = root
server.password = password
server.ip = 172.19.41.21
现在我的代码说要检查每个部分以检索用户名和密码。由于第一部分不包含这些值,因此它失败了。如何查看每个部分的用户名和密码,如果不存在,请转到下一部分。我尝试检查NONE并转到下一部分。但是那段代码很难看而且失败了。像这样:
if env.user=='':
next
有人可以帮助我继续前进吗?
答案 0 :(得分:3)
将此代码添加到for
循环的开头:
if not config.has_option(section, 'server.user_name'):
continue
答案 1 :(得分:2)
由于只有第一部分不包含这些值,因此您可以使用iter
函数。
sections = iter(config.sections())
next(sections)
for section in sections:
# something(section)
或者@tjohnson提到:
for section in config.sections()[1:]:
# something(section)
答案 2 :(得分:1)
另一种方法是捕获异常。
for section in config.sections():
components = dict() #start with empty dictionary for each section
try:
env.user = config.get(section, 'server.user_name')
env.password = config.get(section, 'server.password')
host = config.get(section, 'server.ip')
except ConfigParser.NoOptionError as e:
continue # At least one required option is missing in the section, skip
优点是如果缺少任何选项,该部分将被忽略。
但是,如果您需要是原子的(例如,如果设置有问题)
env.user
如果由于server.ip
不存在而最终忽略该部分,则可能
想要这样的东西。
for section in config.sections():
components = dict() #start with empty dictionary for each section
try:
tmp_user = config.get(section, 'server.user_name')
tmp_password = config.get(section, 'server.password')
tmp_host = config.get(section, 'server.ip')
except ConfigParser.NoOptionError as e:
continue # At least one required option is missing in the section, skip
else:
env.user = tmp_user
env.password = tmp_password
host = tmp_host
在这种情况下,可能更容易使用has_option
3次。