【问题标题】:Python: Configparser - escape newlines?Python:Configparser - 转义换行符?
【发布时间】:2015-12-07 09:50:22
【问题描述】:

有没有办法使用 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

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

【问题讨论】:

标签: python openerp configparser


【解决方案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())))

【讨论】:

    【解决方案2】:

    如果您将向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']
    

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

    【讨论】:

    • 它不起作用。问题是它首先通过 ConfigParser,然后通过 Odoo 检查它期望单个字符串的位置,并且该字符串由逗号分隔。如果我进行任何缩进,则该缩进将添加到路径中,然后找不到该路径(因为它被逗号分割)。如果我只保留\n,那么我会收到问题中的 ConfigParser 错误。
    • 嗯...您需要由两段单独的代码解析相同的字符串,其中每段代码都有自己的任意假设...祝您好运...
    【解决方案3】:

    如果您要存储的是地图,我的建议是将内容存储在地图中 (或您的情况下的列表)并在获取后使用解析器读取定义的值

    像这样:

    [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
    

    注意: 这还没有经过测试,是从另一个帖子重新引用。 如果有人确认这可行,我会删除它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-12
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多