12

ReadTheDocsで拡張機能をコンパイルすることは許可されていませんが実際にコンパイルせずにファイルからdocstringを抽出するcythonように構成することはできますか?sphinxcython

ありがとう!

4

2 に答える 2

19

私は同じ問題に直面し、readthedocsでCython拡張機能をコンパイルできるようになったことを発見しました。

簡単な答え:Cythonモジュールは、readthedocsが提供するvirtualenv機能を使用してコンパイルできます。

少し長い答えとサンプルプロジェクトについては、以下を参照してください。

何が問題ですか?

私が理解しているように、sphinxは、文書化されるプロジェクトのすべてのモジュールをインポートしてから、Pythonでdocstringを抽出します。Cythonモジュールは直接インポートできず、最初にコンパイルする必要があるため、これは失敗します。モジュールのコンパイルは、readthedocsでそのままでは機能しませんが、これを実現するためのツールを提供しています。

これを解決する方法。

プロジェクトをvirtualenvにインストールすると、Cythonモジュールが(.soファイルに)ビルドされ、インポートできるようになります。ただし、これにはいくつかの外部モジュールが必要になる場合があります(以下の例ではnumpy、そしてもちろんCython)。これらは、リポジトリに存在する必要があるpip要件ファイル( )で指定できます。requirements.txt

  1. readthedocsの[管理] ->[詳細設定]でオプションinstall your project inside a virtualenvを有効にします
  2. requirements.txtプロジェクトルートを基準にしたパスを入力します(docs/requirements.txt以下の例)
  3. (必要に応じて、Pythonインタープリターのバージョンを変更してください)

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

Requirements.txt

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

これを解決するには、行を完全に削除します。

これがお役に立てば幸いです。

于 2015-08-07T15:59:37.667 に答える
0

次のスニペットをに追加することで、 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()
于 2012-11-13T16:07:13.820 に答える