很多朋友都知道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环境下:
-
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()
) -
Odoo用到了Python2.7之前的版本不支持的集合的标注法
比如:
fnames = {field.name}
一个向后兼容的修改是这样的:
fnames = set([field.name]) -
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)
) -
Odoo用到了Python2.7从第三方weakrefset库back port到标准库weakref的weakSet类
比如:
from weakref import weakSet
一个向后兼容的修改是这样的:
try:
from weakref import weakSet
except ImportError:
from weakrefset import weakSet -
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): -
安装了不支持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,这个就留给强人研究了。