Python:Configparser - 逃避换行?

时间:2015-12-07 09:50:23

标签: python openerp configparser

有没有办法使用ConfigParser转义换行符?

在配置中有这个选项--addons-path,你可以为插件提供多个路径,但是路径很长,并且有许多路径,所以将所有内容写入一行,看起来非常糟糕。所以我想在多行中添加插件路径,但ConfigParser不允许这样做。我收到这个错误:

Starting odoo-server: Traceback (most recent call last):
  File "/home/oerp/openerp80/odoo/openerp-server", line 5, in <module>
    openerp.cli.main()
  File "/home/oerp/openerp80/odoo/openerp/cli/__init__.py", line 68, in main
    o.run(args)
  File "/home/oerp/openerp80/odoo/openerp/cli/server.py", line 180, in run
    main(args)
  File "/home/oerp/openerp80/odoo/openerp/cli/server.py", line 140, in main
    openerp.tools.config.parse_config(args)
  File "/home/oerp/openerp80/odoo/openerp/tools/config.py", line 358, in parse_config
    self._parse_config(args)
  File "/home/oerp/openerp80/odoo/openerp/tools/config.py", line 403, in _parse_config
    self.load()
  File "/home/oerp/openerp80/odoo/openerp/tools/config.py", line 605, in load
    p.read([self.rcfile])
  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: /etc/odoo-server.conf
    [line  3]: '/home/oerp/openerp80/addons,\n'
    [line  4]: '/home/oerp/openerp80/community-addons\n'

有没有办法在多行中编写路径,但是让ConfigParser将其视为一行(忽略换行符)?

更新

配置文件样本(有效):

someparam = blabla
; this is part I want to modify
addons_path = /some/dir1,/some/dir2,/some/dir3
; some other params

配置文件我想看起来像,但它不起作用:

someparam = blabla
; this is part I want to modify
addons_path = /some/dir1,
/some/dir2,
/some/dir3
; some other params

P.S。只要我可以将路径放在多行中,缩进就可以不同,因此它不会只进入一条长行。

3 个答案:

答案 0 :(得分:1)

之前的答案是朝着正确方向迈出的一步。

在Odoo 9中它的工作原理如下(你需要缩进行并保留逗号,但仍然可以在一行中有多个路径。):

[options]
addons_path =
    /some/dir1,
    /some/dir2,/some/dir3,
    /some/dir4,
    /some/dir5

要在旧版本中实现此目的,您可以修改 odoo / openerp / tools / config.py

搜索此行

os.path.abspath(os.path.expanduser(os.path.expandvars(x)))

并将其替换为

os.path.abspath(os.path.expanduser(os.path.expandvars(x.strip())))

答案 1 :(得分:0)

如果缩进向addons_path参数添加信息的行,它们将被解析为一个字符串。完整示例,值之间不需要逗号(我使用StringIO进行更好的演示,在大多数情况下,您将拥有一个文件对象):

import ConfigParser
import StringIO

config_as_string = '''
[something]
someparam = blabla
; this is part I want to modify
addons_path = 
  /some/dir1
  /some/dir2
  /some/dir3
; some other params
'''

config_as_file = StringIO.StringIO(config_as_string)

config = ConfigParser.ConfigParser()
config.readfp(config_as_file)

addons_path = config.get('something', 'addons_path')

然后addons_path是一个字符串:

>>> print addons_path

/some/dir1
/some/dir2
/some/dir3

并列出:

>>> addons_path.split()
['/some/dir1', '/some/dir2', '/some/dir3']

这些示例有帮助吗?关键是缩进,我想。

答案 2 :(得分:0)

如果您正在存储地图,我的建议是将内容存储在地图中 (或者在你的情况下是一个列表)并且在获取之后只需使用解析器来读取定义的值

像这样:

[Section]
map1:  {key: value,
          key: value,
          .
          .
          .
}
list1:  [value1,
          value2,
          .
          .
          .
]

如果您想让ConfigParser读取多行,就好像它们在一行中引用this post

它基本上表明:

ConfigParser _read()方法的.doc字符串说:

Continuations are represented by an embedded newline then leading whitespace.

意思是你的解决方案会做这样的事情:

[SECTION]
param=
  item1
  item2
  item3

注意: 这尚未经过测试,是另一篇文章的引用。 如果有人确认这是有效的,我会删除它