ReadTheDocsで拡張機能をコンパイルすることは許可されていませんが、実際にコンパイルせずにファイルからdocstringを抽出するcython
ように構成することはできますか?sphinx
cython
ありがとう!
ReadTheDocsで拡張機能をコンパイルすることは許可されていませんが、実際にコンパイルせずにファイルからdocstringを抽出するcython
ように構成することはできますか?sphinx
cython
ありがとう!
私は同じ問題に直面し、readthedocsでCython拡張機能をコンパイルできるようになったことを発見しました。
簡単な答え:Cythonモジュールは、readthedocsが提供するvirtualenv機能を使用してコンパイルできます。
少し長い答えとサンプルプロジェクトについては、以下を参照してください。
私が理解しているように、sphinxは、文書化されるプロジェクトのすべてのモジュールをインポートしてから、Pythonでdocstringを抽出します。Cythonモジュールは直接インポートできず、最初にコンパイルする必要があるため、これは失敗します。モジュールのコンパイルは、readthedocsでそのままでは機能しませんが、これを実現するためのツールを提供しています。
プロジェクトをvirtualenvにインストールすると、Cythonモジュールが(.soファイルに)ビルドされ、インポートできるようになります。ただし、これにはいくつかの外部モジュールが必要になる場合があります(以下の例ではnumpy、そしてもちろんCython)。これらは、リポジトリに存在する必要があるpip要件ファイル( )で指定できます。requirements.txt
install your project inside a virtualenv
を有効にしますrequirements.txt
プロジェクトルートを基準にしたパスを入力します(docs/requirements.txt
以下の例)python setup.py install
これで、ドキュメントがビルドされるたびにプロジェクトが(を使用して)インストールされます。readthedocsの[ビルド]タブでそれぞれのビルドをクリックすると、セットアップスクリプトの出力が[セットアップ出力]の下に表示されます。これは、コンパイル時エラーが表示される可能性がある場所です。プロジェクトのコンパイルには時間がかかる場合があることに注意してください。
いくつかのCythonモジュールで構成されるPythonパッケージで、それぞれにGoogleスタイルのdocstringがあります。
my_project/
setup.py
my_package/
__init__.py # imports Cython modules
cython_module1.pyx
cython_module2.pyx
...
docs/
requirements.txt
Makefile
source/
conf.py
index.rst
... # more documentation
cython>=0.20
numpy>=1.9
私のプロジェクトでこれを試しているときに、Cythonモジュールをインポートできないという問題が発生しました。sphinxのエラーメッセージは次のようになります。
home/docs/checkouts/readthedocs.org/user_builds/... :4: WARNING: autodoc: failed to import module 'cython_module1';...
File "/home/docs/checkouts/readthedocs.org/user_builds/.../__init__.py", ...
from .cython_module1 import CythonClass
これが発生したのは、以前はドキュメントをローカルで作成し、次のような行を追加していたためです。
...
sys.path.insert(0, os.path.abspath('../../')) # path to my_package
...
ここでconf.py
提案されているように私に。これにより、ローカルでビルドするとき(を使用してプロジェクトをコンパイルしたとき)の問題は解決しましたが、virtualenvにインストールするとき、これは間違ったバージョンのmy_package(つまり、インストールされたパッケージではなくソース)を指します。そこにスフィンクスはインポートする.soファイルを見つけることができません。python setup.py build_ext --inplace
これを解決するには、行を完全に削除します。
これがお役に立てば幸いです。
次のスニペットをに追加することで、 C拡張機能に依存するモジュールをモックアウトできconf.py
ます。
import sys
class Mock(object):
def __init__(self, *args, **kwargs):
pass
def __call__(self, *args, **kwargs):
return Mock()
@classmethod
def __getattr__(cls, name):
if name in ('__file__', '__path__'):
return '/dev/null'
elif name[0] == name[0].upper():
mockType = type(name, (), {})
mockType.__module__ = __name__
return mockType
else:
return Mock()
MOCK_MODULES = ['pygtk', 'gtk', 'gobject', 'argparse']
for mod_name in MOCK_MODULES:
sys.modules[mod_name] = Mock()