oe 7.0到oe 8.0 切换的时候发现我们系统的很多的module 无法load , import的时候出错, 后来发现oe 8.0自己的addons 也都做了修改在import自己的addons的时候都加了openerp.addons 命名空间, 这是为什么, oe 8.0为什么要这么做,我找出了背后真正的原因:
Openerp 7.0 的时候系统支持两种import 方式一种是import  <module> 一种是 import openerp .addons. <module> 这种方式,  我们自己的addons 中使用import 大部分是使用的第一种, 现在将我们的addons 迁移到8.0的时候发现很多Could't load module 的情况, 这是什么原因?

1、 首先需要说明openerp 为什么会由两种import 方式, openerp 没有使用默认的python import 机制, 而是在python的import 机制上做了hook , 做了一个自己的importer, 也就是上面说的两种情况。

2、7.0的两种import方式为什么到8.0的时候只剩下第二种import  openerp.addons.<module>这种方式, 却不支持第一种方式了, 这是因为为了方式import 冲突的情况, 比如:python的标准库中一个module 叫resource, 而openerp 中也有这样一个自己的module 如果使用第一种import 方式, 这个时候会出现module 混淆的问题。所以从8.0开始 openerp的 addons 必需添加openrp.addons 命名空间用来加以区分。
3、在oe 7.0 和odoo 8.0中这个差异的具体代码是在哪里实现的呢?

Openerp 7.0 中 server->openerp->modules->module.py 的 AddonsImportHook class 中有这样一个方法:

def find_module(self, module_name, package_path):
        module_parts = module_name.split('.')
        if len(module_parts) == 3 and module_name.startswith('openerp.addons.'):
            return self # We act as a loader too.

# TODO list of loadable modules can be cached instead of always
        # calling get_module_path().
        if len(module_parts) == 1 and \
            get_module_path(module_parts[0],
                display_warning=False):
            try:
                # Check if the bare module name clashes with another module.
                f, path, descr = imp.find_module(module_parts[0])
                _logger.warning("""
Ambiguous import: the OpenERP module `%s` is shadowed by another
module (available at %s).
To import it, use `import openerp.addons.<module>.`.""" % (module_name, path))
                return
            except ImportError, e:
                # Using `import <module_name>` instead of
                # `import openerp.addons.<module_name>` is ugly but not harmful
                # and kept for backward compatibility.
                return self # We act as a loader too.

而在8.0中这个方法是这样的:

def find_module(self, module_name, package_path):
        module_parts = module_name.split('.')
        if len(module_parts) == 3 and module_name.startswith('openerp.addons.'):
            return self # We act as a loader too.

很明显 8.0中比7.0中少了黄色标注的这一部分, 那黄色的这一部分是做什么用的呢, 它就是兼容import <module>这种 方式的实现。 而在8.0中不再支持这种import 

oe7升级到oe8中import的使用的更多相关文章

  1. 当在ECLIPSE中import现存项目时,如遇到版本不符

    当在ECLIPSE中import现存项目时,如遇到版本不符,可选Run-->Run Configurations,进入'Run Configurations'界面,选左边的Android App ...

  2. python中import和from...import...的区别

    python中import和from...import...的区别: 只用import时,如import xx,引入的xx是模块名,而不是模块内具体的类.函数.变量等成员,使用该模块的成员时需写成xx ...

  3. 解决Eclipse Pydev中import时报错:Unresolved import

    在安装 图像处理工具包 mahotas 后,在eclipse中尝试import mahotas时,出现Unresolved import错误,按快捷无法自动生成代码提示 但是,程序运行时可以通过,在命 ...

  4. jsp中@import导入外部样式表与link链入外部样式表的区别

    昨天碰到同事问了一个问题,@impor导入外部样式与link链入外部样式的优先级是怎样的,为什么实验的结果是按照样式表导入后的位置来决定优先级.今天就这个问题具体总结如下:   先解释一下网页添加cs ...

  5. (原)python中import caffe提示no module named google.protobuf.internal

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5993405.html 之前在一台台式机上在python中使用import caffe时,没有出错.但是 ...

  6. pycharm 中 import requests 报错

    一 , 使用Pycharm来抓取网页的时候,要导入requests模块,但是在pycharm中 import requests 报错. 原因: python中还没有安装requests库 解决办法: ...

  7. python中import和from-import的区别

    . import导入模块的路径两种方式 # 将模块所在路径再程序中添加到sys.path列表中 import sys sys.path import导入模块按照sys.path顺序依次查找,“”代表当 ...

  8. eclipse 中 import sun.misc.BASE64Decoder; 报错

    from://http://blog.sina.com.cn/s/blog_48964b120101ahrf.html 在android做3DES加密功能时 eclipse 中 import sun. ...

  9. Windows Server 2012升级R2过程中意外关闭恢复原系统方法

    2012升级R2过程中强制关闭了计算机,导致再次启动后蓝屏提示"BAD_SYSTEM_CONFIG_INFO".用2012安装盘进入尝试修复失败(安全模式什么的都不用想),进入命令 ...

随机推荐

  1. 使用Guava retryer优雅的实现接口重调机制

    API 接口调用异常, 网络异常在我们日常开发中经常会遇到,这种情况下我们需要先重试几次调用才能将其标识为错误并在确认错误之后发送异常提醒.guava-retry可以灵活的实现这一功能.Guava r ...

  2. C# 实现动态添加列,新增合计行,求和

    DataTable da = CommonBLL.GetList("*", "sys_dict", "IfState=1 and DictTypeId ...

  3. canvas 进入游戏点击时苹果手机为什么会闪

    canvas 进入游戏点击时苹果手机为什么会闪 ?? 大神门 谁有解决办法???

  4. 限制输入字符个数的jq插件

    (function($) { $.fn.extend( { limiter: function(limit, elem) { $(this).on("keyup focus", f ...

  5. ORACLE数据库创建动态表

    最近公司一个项目代码里的定时任务无法执行,查验代码良久,奈何代码过于老旧,开发人员换了一茬又一茬,现在都无法理清,故无奈只好到数据库里重新写存过,配置定时任务. 在写存过时,由于检测及安全性能要求,需 ...

  6. 洛谷P3369普通平衡树(Treap)

    题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...

  7. Oracle基础了解

    数据库: 关系型数据库 select * from 表名 非关系型数据库(做不到复杂查询) 以对象的形式进行存储 {"aaa":"ccc"}---键值对 ora ...

  8. Tyvj1933绿豆蛙的归宿

    给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以 ...

  9. CRT【p3868】[TJOI2009]猜数字

    Description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...

  10. 洛谷——P2141 珠心算测验

    P2141 珠心算测验 题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师 ...