我正在编写一个 Python 程序,它使用 ConfigParser 来读取一个配置文件,该文件旨在控制程序配置、执行和定位到其环境和景观的各个方面。我在 RHEL 6.4 上使用 Python 2.6.6。
其配置的一个方面是它需要与多少个 rsyslog 守护进程交互,以及每个实例的详细信息。我选择了 instance<#>_ 格式,使用户能够指定任意数量的实例,并使用一组一致的属性进行配置。配置文件的摘录出现在此处:
[rsyslog]
rules_dir: /etc/rsyslog.d
instance1_enable: no
instance1_name: rsyslog-Group01
instance1_startupscript: /etc/init.d/%(instance1_name)s
instance1_conf: /etc/%(instance1_name)s
instance1_rules: %(rules_dir)s/rules-%(instance1_name)s
instance1_restart: no
instance2_enable: no
instance2_name: rsyslog-Group02
instance2_startupscript: /etc/init.d/%(instance2_name)s
instance2_conf: /etc/%(instance2_name)s
instance2_rules: %(rules_dir)s/rules-%(instance2_name)s
instance2_restart: no
我构建了一个名为“rsyslog”的对象,使其属性如下所示:
rsyslog.instance2_enable="no"
rsyslog.instance2_name="rsyslog-Group02"
...etc
当我将 rsyslog 对象和实例编号传递给函数以让该函数对 instance#_rules 执行操作时,我的问题就出现了。例如,我以这种方式调用该函数:
list_of_rules=read_files(rsyslog,2)
该函数应该返回一个规则列表,它从规则文件中解析出来,例如 instance2
/etc/rsyslog.d/rules-rsyslog-Group02
当我对实例进行硬编码时,解析规则没有问题:
for line in fileinput.input(rsyslog_object.instance7_rules, mode='r'):
ruleline=re_ruleline.search(line)
但是我如何允许类似下面的内容,其中 '' 表示我传递给函数的实例号:
for line in fileinput.input(rsyslog_object.instance<instancenumber>_rules, mode='r'):
我已经使用 locals() 和 globals() 函数在其他上下文中进行变量间接寻址,但我不确定如何在此处应用它们。
或者,如果您能看到一种更好、更优雅或 Pythonic 的方法来解决允许任意数量的连续编号实例的问题,这些实例可以在迭代中通过数字轻松地和更 Pythonic 地引用;请解释如何以及为什么它是完成任务的更好或更Pythonic的方式。
如果有另一种方法,我不会使用实例。ConfigParser 不允许 '.' 在配置中