python sphinx autodoc在运行时之前无法导入。解决办法?

python sphinx autodoc在运行时之前无法导入。解决办法?,python,python-2.7,python-import,odoo-8,python-sphinx,Python,Python 2.7,Python Import,Odoo 8,Python Sphinx,我试图使用Sphinx来记录一个Odoo项目,但在使用autodoc时失败了,因为只有在运行时才能导入。让我把它分解一下: 存储库中至少有一个模块需要从另一个模块导入常量 因为在项目根目录下没有init,要使其工作,导入不是: 从[module_2].models.which导入which 相反,它必须是: 从openerp.addons.[module_2].models.which导入which 这是因为odoo在运行时将来自不同插件路径的所有模块收集到一个池中,并且任何模块都可以从以前加载

我试图使用Sphinx来记录一个Odoo项目,但在使用autodoc时失败了,因为只有在运行时才能导入。让我把它分解一下:

  • 存储库中至少有一个模块需要从另一个模块导入常量
  • 因为在项目根目录下没有init,要使其工作,导入不是:

    从[module_2].models.which导入which

  • 相反,它必须是:

    从openerp.addons.[module_2].models.which导入which

  • 这是因为odoo在运行时将来自不同插件路径的所有模块收集到一个池中,并且任何模块都可以从以前加载的模块导入(顺序取决于依赖项)

    因为上面提到的导入对于Sphinx来说是不可能解决的,所以当我尝试构建时,我得到了一个“Cannotimportname…”错误。我可以删除导入,从另一个模块复制粘贴常量,就是这样,但是仅仅为了autodoc而破坏代码并实现一个糟糕的实践似乎不太可能,我只是开始记录这个巨大的项目,所以我不知道还会出现多少这样的情况(我记得至少还有一个模块是这样做的)。最好的方法是什么

    顺便说一下,回溯是:

        Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/sphinx/ext/autodoc.py", line 657, in import_object
        __import__(self.modname)
      File "account_analytic_default_segment/__init__.py", line 1, in <module>
        from . import models
      File "account_analytic_default_segment/models/__init__.py", line 3, in <module>
        from . import account_analytic
      File "account_analytic_default_segment/models/account_analytic.py", line 7, in <module>
        from openerp.addons.account_analytic_policy.models.analytic import USAGE
    
    回溯(最近一次呼叫最后一次):
    导入对象中的文件“/usr/local/lib/python2.7/dist packages/sphinx/ext/autodoc.py”,第657行
    __导入(self.modname)
    文件“account\u analysis\u default\u segment/\uuuuu init\uuuu.py”,第1行,在
    从。导入模型
    文件“account\u analysis\u default\u segment/models/\uuuuu init\uuuuu.py”,第3行,在
    from.导入帐户
    文件“account\u analysis\u default\u segment/models/account\u analysis.py”,第7行,在
    来自openerp.addons.account\u analysis\u policy.models.analysis import USAGE
    

    在结构方面,该项目位于Odoo配置的addons_路径中包含的一个目录中,该目录与Odoo目录完全分离。在运行时,所有的addons路径都包含在内(将其视为一种符号链接)。但在运行前,它们是不相关的。我已经修复了其他“来自openerp…”的问题通过在PYTHONPATH中包含Odoo来导入,但这并不能解决从项目中的另一个模块导入时的问题,因为它们在运行前彼此看不到,在运行期间只能从Odoo加载项池访问。

    此模块对您的文档非常重要吗?如果不重要,您可以将其添加到Sphinx中模拟列表,它会忽略它。缺点是你不能在文档中引用此模块的任何内容,要求覆盖每个模块。你建议如何使用它?我尝试添加了['openerp.addons.account\u analysis\u policy.models.analysis']希望它能处理来自该模块的每个导入都是有效的,但它似乎不是这样工作的,但可能我做错了什么。我需要的是sphinx处理“from openerp.addons.account\u analysis\u policy.models.analysis import USAGE”行有效。我建议在文档目录中的conf.py脚本中写入以下行:
    MOCK\u MODULES=[openerp.addons.account\u analytic\u policy.models.analytic]
    然后
    sys.MODULES.update((mod\u name,MOCK())用于MOCK\u模块中的mod\u name)
    遗憾的是,它不起作用。我仍然收到了一封邮件。我实际上已经放弃了,并决定仅出于文档目的进行更改,并留下注释解释为什么主分支代码与文档中的源代码不同。奥多自己说,这些导入不是一个好主意,但它们是唯一的选择(复制粘贴除外)当您需要使用在类/模型外部定义的常量或方法时。请注意,我所写的只是一个示例,以防您只想忽略该库。如果问题仍然存在,那可能是因为其他库导致了问题。您可以将所有要添加到模拟列表中的库,即
    mock\u MODULES=[library1,library2…]
    此模块对您的文档非常重要吗?如果不重要,您可以将其添加到Sphinx模拟列表中,它将忽略它。缺点是您将无法在文档中引用此模块的任何内容,要求覆盖每个模块。您建议如何使用它?我尝试添加了['openerp.addons.account_-analysis_-policy.models.analysis']希望它能处理来自该模块的每个导入都是有效的,但它似乎不是这样工作的,但可能我做错了什么。我需要sphinx处理“from-openerp.addons.account_-analysis_-policy.models.analysis-import用法”行有效。我建议在文档目录中的conf.py脚本中写入以下行:
    MOCK\u MODULES=[openerp.addons.account\u analytic\u policy.models.analytic]
    然后
    sys.MODULES.update((mod\u name,MOCK())用于MOCK\u模块中的mod\u name)
    遗憾的是,它不起作用。我仍然收到了一封邮件。我实际上已经放弃了,并决定仅出于文档目的进行更改,并留下注释解释为什么主分支代码与文档中的源代码不同。奥多自己说,这些导入不是一个好主意,但它们是唯一的选择(复制粘贴除外)当您需要使用在类/模型外部定义的常量或方法时。请注意,我所写的只是一个示例,以防您只想忽略该库。如果问题仍然存在,那可能是因为其他库导致了问题。您可以将所有要添加到模拟列表中的库,即
    mock\u MODULES=[图书馆1、图书馆2…][/code>