Odoo 只能运行在 Python 2.7 :-(

我本来也没有对Python版本的要求有特别关注,因为所有的安装环境都用了最新Python2.7.X。直到最近在客户提供的一台CentOS 6.7的服务器上运行Odoo时才意识到这个要求。并且搞明白了为什么不能运行在CentOS6.7默认安装的Python 2.6环境下。 很多朋友都知道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,这个就留给强人研究了。