oe7升级到oe8中import的使用

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的使用,布布扣,bubuko.com

时间: 2024-08-05 05:06:54

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

objective-c中#import和@class的区别

在Objective-C中,可以使用#import和@class来引用别的类型, 但是你知道两者有什么区别吗? @class叫做forward-class,  你经常会在头文件的定义中看到通过@class的引用, 原因就是当你只用@class来引入一个类时, 编译器知道有这么一个类,也就是说它能识别Engine *engine; 而在implementation文件中,如果你想要访问engine.price, 编译器就会出错, 即使你用了@class引入了. 这时需要使用的其实是#import

java中import、package作用和用法

  有些人写了一阵子 Java,可是对於 Java 的 package 跟 import 还是不 太了解很多人以為原始码 .java 档案中的 import 会让编译器把所 import 的程式通通写到编译好的 .class 档案中,或是认為 import 跟 C/C++ 的 #include 相似,实际上,这是错误的观念. 让我们先了解一下,Java 的 package 到底有何用处. 其实,package 名称就像是我们的姓,而 class 名称就像是我们的名字 .package 名称有很多

python中import的机制与实现

原文出处: 刘畅(@你猜我猜不猜猜你是谁) 概述 Python 是一门优美简单.功能强大的动态语言.在刚刚接触这门语言时,我们会被其优美的格式.简洁的语法和无穷无尽的类库所震撼.在真正的将python应用到实际的项目中,你会遇到一些无法避免的问题.最让人困惑不解的问题有二类,一个 编码问题,另一个则是引用问题. 本文主要讨论关于Python中import的机制与实现.以及介绍一些有意思的Python Hooks. Python 类库引入机制 首先,看一个简单的例子: """

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

2012升级R2过程中强制关闭了计算机,导致再次启动后蓝屏提示"BAD_SYSTEM_CONFIG_INFO".用2012安装盘进入尝试修复失败(安全模式什么的都不用想),进入命令提示符查看错误日志发现是由注册表意外损坏引起(本想上调试器). 由于Windows在升级时会对原有注册表进行备份,可以在对应操作系统盘符+"\Windows\System32\config\RegBack"下找到(例如:C:\Windows\System32\config\RegBack)

Objective-C 中 #import 和 #include 的区别

预编译指令Objective-C:#importC,C++:#include#import由gcc编译器支持 在 Objective-C 中,#import 被当成 #include 指令的改良版本来使用.除此之外,#import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题. 使用哪一个还是由你来决定.一般来说,在导入 Objective-C 头文件的时候使用 #import,包含 C 头文件时使用 #include.比如: #import #include#include #i

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

在安装 图像处理工具包 mahotas 后,在eclipse中尝试import mahotas时,出现Unresolved import错误,按快捷无法自动生成代码提示 但是,程序运行时可以通过,在命令行中import时,正常 解决方法如下: 在project右击打开菜单 ->选择properties->选择"PyDev-Interpreter/Grammar"->点击链接"Click here to configure an interpreter not

iOS 中 #import 和 @class 的区别

1.#import 会包含这个类的所有信息,包括实体变量和方法,而 @class 只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你. 2.在头文件(.h 文件)中, 一般只需要知道被引用的类的名称就可以了. 不需要知道其内部的实体变量和方法,所以在头文件中一般使用 @class 来声明这个名称是类的名称. 而在实现类(.m 文件)里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用 #import 来包含这个被引用类的头文件. 3.在编译

python中import或from使用及模块和包的使用总结

一.简介 1.模块(module):根据python官方的解释,所谓模块就是一个.py文件,用来存放变量,方法的文件,便于在其他python文件中导入(通过import或from); 2.包(package): 包是更大的组织单位,用来组织区别管理多个模块文件;引用官方的说法:"假设你想要设计一个模块(包)来统一处理声音文件和声音数据的集合.有许多不同的声音文件格式(例:.wav,.aiff,.au,.mp3等),因此您可能需要创建和维护不断增长的模块集合,以便在各种文件格式之间进行转换.对于声

当你在 python中 import不到模块的时候

在 python中 import sys print sys.path 看一看模块的 引用路径 ,再看一看你的 模块路径 在不在这里面 rpm -ql .....你的模块(package) 如果不存在,那么就在 /etc/profile最后一行加上 export PYTHONPATH=$PYTHONPATH:你那个包的 路径 完成后保存退出 输入 source /etc/profile 再打开新的终端,看看在python直接import那个包行不行