web-dev-qa-db-ja.com

Sphinx:自動モジュールでインポートを除外する方法は?

RPi.GPIOモジュールを使用するPythonで記述されたRaspberryPiプロジェクトがあります。コードのすべての作業はRPi.GPIOがインストールされないWindowsボックスで行われ、毎回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

これを回避する方法はありますか?

21
pandasauce

一部のインポートを除外するようにSphinxに指示する方法はありません。 autodocを使用する場合、文書化されたすべてのモジュールはクリーンにインポート可能である必要があります。

モック を実行することで、問題を回避できる可能性があります。これは、あなたと非常によく似ていると思われる問題の解決策を説明する記事です: 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 構成値に追加するだけです。

28
mzjn

モジュールのモックに加えて、組み込みシステムでのみ意味のある呼び出しをモックする必要がありました(たとえば、FPGAからレジスタを読み取るモジュールexamplemodから関数read_reg()への呼び出しをモックします。 SPI経由)。

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

Python-moxが必要であることに注意してください:Sudo apt-get install python-mox

参照: 組み込みシステムで実行されているコードのpythonコード)のsphinxドキュメントを生成する方法

3
jcarballo

ほんの数分前に、別の解決策を見つけました。ファイルの先頭に「importRPi.GPIO」を配置しないでください。関数/メソッド内に配置します(おそらく良いスタイルではありません)。そのため、sphinxはそれを認識せず、ドキュメントが作成されます。

しかし、モックを使用したソリューションの方が優れています。リンクは次のとおりです。 http://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html#confval-autodoc_mock_imports

Conf.pyに次の行を追加するだけです(RPiとシリアルは例です)。

autodoc_mock_imports = ["RPi", 'serial']
1
Guenther1978