跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. Openerp 7.0与8.0 import 方式的变化

Openerp 7.0与8.0 import 方式的变化

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
6 帖子 4 发布者 4.9k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • S 离线
    S 离线
    snowkite
    写于 最后由 编辑
    #1

    [color=navy][/color]上周在做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.

          [color=navy] # TODO list of loadable modules can be cached instead of always
            # calling get_module_path().
            if len(module_parts) == 1 and <br />            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.&lt;module&gt;..""" % (module_name, path))
                    return
                except ImportError, e:
                    # Using import &lt;module_name&gt; instead of
                    # import openerp.addons.&lt;module_name&gt; is ugly but not harmful
                    # and kept for backward compatibility.
                    return self # We act as a loader too.[/color]


    而在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


    《上海并擎软件科技有限公司》—— 项目开发经理

    1 条回复 最后回复
    0
    • JoshuaJ 离线
      JoshuaJ 离线
      Joshua 管理员
      写于 最后由 编辑
      #2

      很好的分享,感谢楼主。 🙂

      【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

      1 条回复 最后回复
      0
      • mrshellyM 离线
        mrshellyM 离线
        mrshelly
        写于 最后由 编辑
        #3

        黄色在哪里?????????????????????

        1 条回复 最后回复
        0
        • S 离线
          S 离线
          snowkite
          写于 最后由 编辑
          #4

          [quote author=mrshelly link=topic=16463.msg28315#msg28315 date=1403847037]
          黄色在哪里?????????????????????
          [/quote]

          :)不好意思, 我自己在我本地写的时候用来黄色做标注,放上来忘记加颜色了, 用黄色发现很难看, 现在改成深蓝色的了 🙂

          1 条回复 最后回复
          0
          • 卓忆卓 离线
            卓忆卓 离线
            卓忆
            写于 最后由 编辑
            #5

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

            恬淡

            1 条回复 最后回复
            0

            • 登录

            • 没有帐号? 注册

            • 登录或注册以进行搜索。
            • 第一个帖子
              最后一个帖子
            0
            • 版块
            • 标签
            • 热门
            • 用户
            • 群组