2014-03-19 10 views
3

配置文件通常需要每個節的節標題。在rsyncd config文件中,全局部分不需要顯式地具有節標題。一個rsyncd.conf文件的例子:使用全局選項解析rsyncd配置文件時出現ConfigParser.MissingSectionHeaderError

[rsyncd.conf]

# GLOBAL OPTIONS 

path   = /data/ftp 
pid file  = /var/run/rsyncdpid.pid 
syslog facility = local3 
uid    = rsync 
gid    = rsync 
read only  = true 
use chroot  = true 

# MODULE OPTIONS 
[mod1] 
... 

如何使用Python ConfigParser解析這樣的配置文件? 執行以下給出了一個erorr:

>>> import ConfigParser 
>>> cp = ConfigParser.ConfigParser() 
>>> cp.read("rsyncd.conf") 

# Error: ConfigParser.MissingSectionHeaderError: File contains no section headers. 

回答

1

亞歷泰利provided a solution使用ConfigParser解析相似文件(其是少部分的文件)。 他的解決方案是一個類似文件的包裝器,它會自動插入一個虛擬部分。

您可以將上述解決方案應用於解析rsyncd配置文件。

>>> class FakeGlobalSectionHead(object): 
...  def __init__(self, fp): 
...   self.fp = fp 
...   self.sechead = '[global]\n' 
...  def readline(self): 
...   if self.sechead: 
...    try: return self.sechead 
...    finally: self.sechead = None 
...   else: return self.fp.readline() 
... 
>>> cp = ConfigParser() 
>>> cp.readfp(FakeGlobalSectionHead(open('rsyncd.conf'))) 
>>> print(cp.items('global')) 
[('path', '/data/ftp'), ('pid file', '/var/run/rsyncdpid.pid'), ...] 
8

我用itertools.chain(Python 3中):

import configparser, itertools 
cfg = configparser.ConfigParser() 
filename = 'foo.ini' 
with open(filename) as fp: 
    cfg.read_file(itertools.chain(['[global]'], fp), source=filename) 
print(cfg.items('global')) 

source=filename導致更好的錯誤信息,特別是如果你從多個配置文件讀取。)

+0

不錯!這解決了我的問題,教會了我一個很好的Python技巧。謝謝! –