Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

Openerp 7.0与8.0 import 方式的变化



  • [color=navy][/color]上周在做oe 7.0到oe 8.0 切换的时候发现我们系统的很多的module 无法load , import的时候出错, 后来发现oe 8.0自己的addons 也都做了修改在import自己的addons的时候都加了openerp.addons 命名空间, 这是为什么, oe 8.0为什么要这么做,我找出了背后真正的原因:<br />Openerp 7.0 的时候系统支持两种import 方式一种是import  <module> 一种是 import openerp .addons. <module> 这种方式,  我们自己的addons 中使用import 大部分是使用的第一种, 现在将我们的addons 迁移到8.0的时候发现很多Could't load module 的情况, 这是什么原因?<br /><br />1、 首先需要说明openerp 为什么会由两种import 方式, openerp 没有使用默认的python import 机制, 而是在python的import 机制上做了hook , 做了一个自己的importer, 也就是上面说的两种情况。<br /><br />2、7.0的两种import方式为什么到8.0的时候只剩下第二种import  openerp.addons.<module>这种方式, 却不支持第一种方式了, 这是因为为了防止import 冲突的情况, 比如:python的标准库中一个module 叫resource, 而openerp 中也有这样一个自己的module 如果使用第一种import 方式, 这个时候会出现module 混淆的问题。所以从8.0开始 openerp的 addons 必需添加openrp.addons 命名空间用来加以区分。<br /><br />3、在oe 7.0 和odoo 8.0中这个差异的具体代码是在哪里实现的呢?<br /><br />Openerp 7.0 中 server->openerp->modules->module.py 的 AddonsImportHook class 中有这样一个方法:<br /><br />def find_module(self, module_name, package_path):<br />        module_parts = module_name.split('.')<br />        if len(module_parts) == 3 and module_name.startswith('openerp.addons.'):<br />            return self # We act as a loader too.<br /><br />      [color=navy] # TODO list of loadable modules can be cached instead of always<br />        # calling get_module_path().<br />        if len(module_parts) == 1 and <br />            get_module_path(module_parts[0],<br />                display_warning=False):<br />            try:<br />                # Check if the bare module name clashes with another module.<br />                f, path, descr = imp.find_module(module_parts[0])<br />                _logger.warning("""<br />Ambiguous import: the OpenERP module %s is shadowed by another<br />module (available at %s).<br />To import it, use import openerp.addons.&lt;module&gt;..""" % (module_name, path))<br />                return<br />            except ImportError, e:<br />                # Using import &lt;module_name&gt; instead of<br />                # import openerp.addons.&lt;module_name&gt; is ugly but not harmful<br />                # and kept for backward compatibility.<br />                return self # We act as a loader too.[/color]<br /><br /><br />而在8.0中这个方法是这样的:<br /><br /><br />def find_module(self, module_name, package_path):<br />        module_parts = module_name.split('.')<br />        if len(module_parts) == 3 and module_name.startswith('openerp.addons.'):<br />            return self # We act as a loader too.<br /><br /><br /><br />很明显 8.0中比7.0中少了深蓝色标注的这一部分代码, 那深蓝色的这一部分代码是做什么用的呢, 它就是兼容import <module>这种 方式的实现。 而在8.0中不再支持这种import<br /><br /><br />《上海并擎软件科技有限公司》—— 项目开发经理



  • [color=navy][/color]上周在做oe 7.0到oe 8.0 切换的时候发现我们系统的很多的module 无法load , import的时候出错, 后来发现oe 8.0自己的addons 也都做了修改在import自己的addons的时候都加了openerp.addons 命名空间, 这是为什么, oe 8.0为什么要这么做,我找出了背后真正的原因:<br />Openerp 7.0 的时候系统支持两种import 方式一种是import  <module> 一种是 import openerp .addons. <module> 这种方式,  我们自己的addons 中使用import 大部分是使用的第一种, 现在将我们的addons 迁移到8.0的时候发现很多Could't load module 的情况, 这是什么原因?<br /><br />1、 首先需要说明openerp 为什么会由两种import 方式, openerp 没有使用默认的python import 机制, 而是在python的import 机制上做了hook , 做了一个自己的importer, 也就是上面说的两种情况。<br /><br />2、7.0的两种import方式为什么到8.0的时候只剩下第二种import  openerp.addons.<module>这种方式, 却不支持第一种方式了, 这是因为为了防止import 冲突的情况, 比如:python的标准库中一个module 叫resource, 而openerp 中也有这样一个自己的module 如果使用第一种import 方式, 这个时候会出现module 混淆的问题。所以从8.0开始 openerp的 addons 必需添加openrp.addons 命名空间用来加以区分。<br /><br />3、在oe 7.0 和odoo 8.0中这个差异的具体代码是在哪里实现的呢?<br /><br />Openerp 7.0 中 server->openerp->modules->module.py 的 AddonsImportHook class 中有这样一个方法:<br /><br />def find_module(self, module_name, package_path):<br />        module_parts = module_name.split('.')<br />        if len(module_parts) == 3 and module_name.startswith('openerp.addons.'):<br />            return self # We act as a loader too.<br /><br />      [color=navy] # TODO list of loadable modules can be cached instead of always<br />        # calling get_module_path().<br />        if len(module_parts) == 1 and <br />            get_module_path(module_parts[0],<br />                display_warning=False):<br />            try:<br />                # Check if the bare module name clashes with another module.<br />                f, path, descr = imp.find_module(module_parts[0])<br />                _logger.warning("""<br />Ambiguous import: the OpenERP module %s is shadowed by another<br />module (available at %s).<br />To import it, use import openerp.addons.&lt;module&gt;..""" % (module_name, path))<br />                return<br />            except ImportError, e:<br />                # Using import &lt;module_name&gt; instead of<br />                # import openerp.addons.&lt;module_name&gt; is ugly but not harmful<br />                # and kept for backward compatibility.<br />                return self # We act as a loader too.[/color]<br /><br /><br />而在8.0中这个方法是这样的:<br /><br /><br />def find_module(self, module_name, package_path):<br />        module_parts = module_name.split('.')<br />        if len(module_parts) == 3 and module_name.startswith('openerp.addons.'):<br />            return self # We act as a loader too.<br /><br /><br /><br />很明显 8.0中比7.0中少了深蓝色标注的这一部分代码, 那深蓝色的这一部分代码是做什么用的呢, 它就是兼容import <module>这种 方式的实现。 而在8.0中不再支持这种import<br /><br /><br />《上海并擎软件科技有限公司》—— 项目开发经理


  • 管理员

    很好的分享,感谢楼主。 :-)



  • 黄色在哪里?????????????????????<br />



  • [quote author=mrshelly link=topic=16463.msg28315#msg28315 date=1403847037]<br />黄色在哪里?????????????????????<br />[/quote]<br /><br /> :)不好意思, 我自己在我本地写的时候用来黄色做标注,放上来忘记加颜色了, 用黄色发现很难看, 现在改成深蓝色的了 :)



  • 虽然暂时还看不懂,谢谢楼主分享,继续哈 :)


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待