Python 使用ConfigParser将字符串作为配置值读取

Python 使用ConfigParser将字符串作为配置值读取,python,parsing,configparser,Python,Parsing,Configparser,我正在尝试编写一个实用程序,它允许我根据配置文件设置在unix shell中运行的命令。基本上,我希望能够给出一个[Command List]和一个预期的[Response List]。。下面是我的一个配置文件的示例: # Command File # List of commands to be carried out for each host listed in `veri.serv.cfg` [Command List] ; T server nc -zw1 159.1.1.1 998

我正在尝试编写一个实用程序,它允许我根据配置文件设置在unix shell中运行的命令。基本上,我希望能够给出一个
[Command List]
和一个预期的
[Response List]
。。下面是我的一个配置文件的示例:

# Command File
# List of commands to be carried out for each host listed in `veri.serv.cfg`

[Command List]
; T server
nc -zw1 159.1.1.1 9988 | gawk '{print $7}'

; P Server
nc -zw1 sup.serv.com 8050 | gawk '{print $7}'

; G L Service
nc -zw1 hi.serv.com 80 | gawk '{print $7}'

; L and N Hosts
nc -zw1 l.serv.com 80 | gawk '{print $7}'
nc -zw1 ln.serv.com 443 | gawk '{print $7}'
nc -zw1 llnn.serv.com 443 | gawk '{print $7}'
但是,当我尝试使用
parser.items('Command List')
解析它时,我得到:

  File "veri.py", line 22, in <module>
    print subConfigParser.read(os.path.join(relativeRunPath, 'veri.cfg'))
  File "/usr/lib/python2.7/ConfigParser.py", line 305, in read
    self._read(fp, filename)
  File "/usr/lib/python2.7/ConfigParser.py", line 546, in _read
    raise e
ConfigParser.ParsingError: File contains parsing errors

[line  6]: "nc -zw1 159.1.1.1 9988 | gawk '{print $7}'\n"
[line  9]: "nc -zw1 sup.serv.com 8050 | gawk '{print $7}'\n"
[line 12]: "nc -zw1 hi.serv.com 80 | gawk '{print $7}'\n"
[line 15]: "nc -zw1 l.serv.com 80 | gawk '{print $7}'\n"
[line 16]: "nc -zw1 ln.serv.com 443 | gawk '{print $7}'\n"
[line 17]: "nc -zw1 llnn.serv.com 443 | gawk '{print $7}'\n"

您的配置文件未使用ConfigParser的有效格式。它需要是一系列的节,后跟命名的选项,例如

[T server]
commands = nc -zw1 159.1.1.1 9988 | gawk '{print $7}'

[P Server]
commands = nc -zw1 sup.serv.com 8050 | gawk '{print $7}'

[G L Service]
commands = nc -zw1 hi.serv.com 80 | gawk '{print $7}'

[L and N Hosts]
commands = nc -zw1 l.serv.com 80 | gawk '{print $7}'
    nc -zw1 ln.serv.com 443 | gawk '{print $7}'
    nc -zw1 llnn.serv.com 443 | gawk '{print $7}'
然后,您可以获得这些值

>>> from ConfigParser import SafeConfigParser
>>> parser = SafeConfigParser()
>>> parser.read('myconfig.ini')
['myconfig.ini']
>>> for section in parser.sections():
...     print 'section', section
...     for option in parser.options(section):
...             print parser.get(section, option)
... 
section T server
nc -zw1 159.1.1.1 9988 | gawk '{print $7}'
section P Server
nc -zw1 sup.serv.com 8050 | gawk '{print $7}'                                                                                                                                  
section G L Service                                                                                                                                                            
nc -zw1 hi.serv.com 80 | gawk '{print $7}'                                                                                                                                     
section L and N Hosts                                                                                                                                                          
nc -zw1 l.serv.com 80 | gawk '{print $7}'                                                                                                                                      
nc -zw1 ln.serv.com 443 | gawk '{print $7}'                                                                                                                                    
nc -zw1 llnn.serv.com 443 | gawk '{print $7}'                                                                                                                                  
>>>                                                                                 

嗯,这是不幸的-所以没有办法没有一个选项,值对?如果你喜欢你的格式而不是标准的ini文件,你可以编写你自己的解析器。您可以过滤掉以“;”开头或为空的行,扫描“[xx]”,然后将剩余的行添加到您自己的dict中。
>>> from ConfigParser import SafeConfigParser
>>> parser = SafeConfigParser()
>>> parser.read('myconfig.ini')
['myconfig.ini']
>>> for section in parser.sections():
...     print 'section', section
...     for option in parser.options(section):
...             print parser.get(section, option)
... 
section T server
nc -zw1 159.1.1.1 9988 | gawk '{print $7}'
section P Server
nc -zw1 sup.serv.com 8050 | gawk '{print $7}'                                                                                                                                  
section G L Service                                                                                                                                                            
nc -zw1 hi.serv.com 80 | gawk '{print $7}'                                                                                                                                     
section L and N Hosts                                                                                                                                                          
nc -zw1 l.serv.com 80 | gawk '{print $7}'                                                                                                                                      
nc -zw1 ln.serv.com 443 | gawk '{print $7}'                                                                                                                                    
nc -zw1 llnn.serv.com 443 | gawk '{print $7}'                                                                                                                                  
>>>