python sphinx autodoc在运行时之前无法导入。解决办法?
我试图使用Sphinx来记录一个Odoo项目,但在使用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在运行时将来自不同插件路径的所有模块收集到一个池中,并且任何模块都可以从以前加载
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>