狮身人面像:如何排除自动模块中的进口?

时间:2013-04-08 21:48:23

标签: python-sphinx importerror gpio autodoc

我有一个用Python编写的Raspberry Pi项目,它使用RPi.GPIO模块。关于代码的所有工作都是在Windows机器上完成的,RPi.GPIO不会安装,每次我尝试运行autodoc时都会崩溃,说它无法导入RPi.GPIO。

D:\cube\docs\ledcube.rst:4: WARNING: autodoc: failed to import module u'ledcube'
; the following exception was raised:
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\sphinx-1.2b1-py2.7.egg\sphinx\ext\autodoc.
py", line 326, in import_object
    __import__(self.modname)
  File "D:\cube\ledcube.py", line 2, in <module>
    import RPi.GPIO as GPIO
ImportError: No module named RPi.GPIO

有什么方法吗?

3 个答案:

答案 0 :(得分:20)

没有办法告诉Sphinx排除一些进口。使用autodoc时,所有记录的模块必须干净可导入。

您可以通过执行一些mocking来解决问题。这篇文章描述了与您的问题非常相似的问题的解决方案:http://blog.rtwilson.com/how-to-make-your-sphinx-documentation-compile-with-readthedocs-when-youre-using-numpy-and-scipy/。这是一个小代码示例(打算添加到conf.py):

import mock

MOCK_MODULES = ['numpy', 'matplotlib', 'matplotlib.pyplot']
for mod_name in MOCK_MODULES:
    sys.modules[mod_name] = mock.Mock()

您可能需要安装python-mock才能使上述工作正常:sudo apt-get install python-mock

更新

自Sphinx 1.3以来,设置模拟更容易。只需将要模拟的模块添加到autodoc_mock_imports配置值。

答案 1 :(得分:3)

除了模拟模块之外,我还必须模拟仅在我的嵌入式系统中有意义的调用(例如,模拟从模块read_reg()调用函数examplemod,该函数从FPGA读取寄存器通过SPI)。

import mox as mox 
import examplemod
m = mox.Mox()
m.StubOutWithMock(examplemod, 'read_reg')

请注意,您需要python-mox:sudo apt-get install python-mox

参考:How to generate sphinx documentation for python code running in an embedded system

答案 2 :(得分:0)

就在几分钟前,我找到了另一个解决方案: 不要在文件的开头放置“ import RPi.GPIO”。 将其放在函数/方法中(可能不是很好的样式)。 因此sphinx将看不到它,并且将建立一个文档。

但是使用模拟的解决方案更好,这是一个链接: http://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#confval-autodoc_mock_imports

只需将以下行添加到conf.py中(RPi和serial是示例):

autodoc_mock_imports = ["RPi", 'serial']