0

我正在编写一个 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 不允许 '.' 在配置中

4

1 回答 1

1

我不确定我是否完全理解这个问题,但不是getattr你想要的:

for line in fileinput.input(
   getattr(rsyslog_object, 'instance%d_rules' % instancenumber),
   mode='r'):
    ...
于 2014-03-12T06:30:42.037 回答