很多朋友都知道Odoo当前版本(9.0)目前不支持Python 3.X。但是,大概并不清楚Odoo 9.0实际上目前只能运行在Python 2.7。

我本来也没有对Python版本的要求有特别关注,因为所有的安装环境都用了最新Python2.7.X。直到最近在客户提供的一台CentOS 6.7的服务器上运行Odoo时才意识到这个要求。并且搞明白了为什么不能运行在CentOS6.7默认安装的Python 2.6环境下。

当按部署要求安装了数据库和所有Python依赖库后,启动Odoo服务器,立即有Syntax Error报错。查看Odoo源文件发现了以下这么几个原因导致了Odoo不能运行在Python 2.6环境下:

  1. Odoo用到了Python 2.7之前的版本不支持的字典解析表达式(dict comprehension)
    比如:
    { name: self.to_field(model, field, fromtype)
    for name, field in model._fields.iteritems()
    }

    一个向后兼容的修改是这样的:

    dict(
    (name, self.to_field(model, field, fromtype))
    for name, field in model._fields.iteritems()
    )
  2. Odoo用到了Python2.7之前的版本不支持的集合的标注法
    比如:

    fnames = {field.name}

    一个向后兼容的修改是这样的:
    fnames = set([field.name])
  3. Odoo用到了Python2.7之前的版本不支持的集合解析表达式 (set comprehension)
    比如:

    fnames = {fname
    for fname, fcolumn in self._columns.iteritems()
    if fcolumn._multi == multi
    if not fcolumn.groups or self.user_has_groups(fcolumn.groups)
    }

    一个向后兼容的修改是这样的:

    fnames = set(fname
    for fname, fcolumn in self._columns.iteritems()
    if fcolumn._multi == multi
    if not fcolumn.groups or self.user_has_groups(fcolumn.groups)
    )
  4. Odoo用到了Python2.7从第三方weakrefset库back port到标准库weakref的weakSet类
    比如:

    from weakref import weakSet

    一个向后兼容的修改是这样的:

    try:
    from weakref import weakSet
    except ImportError:
    from weakrefset import weakSet
  5. Odoo用到了Python2.7之前版本不支持的with 表达式写法(一行表示多个嵌套的context manager)

    with tools.ignore(Exception), tools.mute_logger('openerp.sql_db'), sql_db.db_connect(dbname, allow_uri=True).cursor() as cr:

    一个向后兼容的修改是这样的:

    import contextlib
    with contextlib.nested(tools.ignore(Exception), tools.mute_logger('openerp.sql_db'), sql_db.db_connect(dbname, allow_uri=True).cursor()) as (_,_,cr):
  6. 安装了不支持Python2.6的reportlab
    在requirements.txt中对reportlab依赖库的版本要求是 reportlab==3.1.44
    而该版本的reportlab不支持Python2.6解决办法:安装支持Python2.6的reportlab 2.7

    sudo pip uninstall reportlab
    sudo pip install https://pypi.python.org/packages/source/r/reportlab/reportlab-2.7.tar.gz

目前发现的影响Odoo向低版本Python兼容的问题就这些,理论上按上面介绍的方法去修改是可以让Odoo运行在Python2.7以下的版本的。

不过个人私下以为,对低版本Python的支持基本属闲的蛋疼,更靠谱的应该是让Odoo能运行于Py3或pypy,这个就留给强人研究了。