2012-04-07 4 views
12

私は最近、すべてのモジュール(トップレベル__init__.pyを除く)の名前を*.pyxに変更し、ext_modules = [Extension('foo', ['foo.pyx'])]setup.pyに置き換えて、私のプロジェクトをCython化しました。ビルドとインストールはうまく動作します。しかし、cd doc; make htmlを実行すると、*.pyxのモジュールをインポートできないため、Sphinxは失敗します。SphinxをCythonでどのように使うのですか?

私はdoc/conf.pyを編集してsys.path.insert(0, os.path.abspath('../build/temp.linux-x86_64-2.7'))sys.path.insert(0, os.path.abspath('..'))を変更すると、スフィンクスは、すべてのモジュールを見つけることができますし、ドキュメントを生成することができますが、その場合には、私はerror while formatting arguments for foo.bar: <built-in function bar> is not a Python functionのようなエラーが発生します。おそらくこれは、現在スフィンクスがソースファイルではなく*.soファイルにしかアクセスできないためです。同じsys.pathの変更でも、スフィンクス(make doctest)経由でdoctestを実行することができます。

私が試した他の解決策は、*.pyxの代わりに*.pyの内線を使用していました(にext_modules = [Extension('foo', ['foo.py'])]を使用していました)。この場合、ドキュメントは正しく構築されますが、doctestは現在Cythonをバイパスしていると思います。

私は、SphinxとCythonを一緒に使用することについてオンラインで情報を見つけることができませんでした。私は両方を使用するいくつかのプロジェクトのソースコードを見てきましたが、*.pyxファイルのdocstringsを利用していないようです。私はセージがそうであることを知っていますが、そのプロジェクトは私が離れて選ぶには複雑​​すぎます。

SphinxはCythonファイルのdocstringをサポートしていますか?もしそうなら、私はこの作品をどうやって作るのですか?

答えて

4

もっと良い回答をお気軽にお寄せください。しかし、ここで私が見つけた修正があります。

dipyプロジェクトは、doc/conf.pyから独自のモジュールを手動でインポートします。これには、モジュールを最初にインストールする必要がありますが、インポートエラーが修正されます(DoctestはCython化されたファイルで実行されます)。

しかし、error while formatting argumentsの問題はまだあります。まず、メソッド/関数のシグネチャを*.soファイルに埋め込むようにCythonに指示する必要があります。これを行うには、embedsignature Cythonディレクティブを設定します。 dipyプロジェクトでは*.pyxファイルごとにこれが設定されていますが、setup.pyに設定することもできます(その方法については、Cythonのマニュアルを参照してください)。これはまだSphinxのドキュメントにメソッドの署名を入れません!メソッドシグネチャの問題hereのバグレポートとパッチがあります。現在のSphinxの最新リリース(1.1.3)ではまだ含まれていませんが、開発リポジトリからSphinxをインストールすると動作します。

6

あなたはここで混乱したビットを見ます。スフィンクスは構文解析器ではありません。あなたのPythonコードを実行可能にして、スフィンクスがドキュメントストリングをキャッチできるようにする必要があります。そのため、拡張子ファイルの名前を ".py"に変更しても効果がありません。

最近、私はSphinxとCythonで最近仕事をしています。自分の経験を共有したいと思います... docstringsからコンパイルされたCython拡張のhtmlドキュメントを自動生成する手順は次のとおりです。

[注:私はスフィンクス1.1.3とCython 0.17.4使用]それは持つことができ、すべての制限付きで(すべての

まず、Pythonの「ドキュメンテーション文字列」を使用 - たとえばにより、あなたが記述することはできませんコンストラクタ。あなたのCythonコードで)docstrings仕様を参照してください:

cdef class PyLabNode: 
    """ 
    This is a LabNode !!! 
    """ 
    cdef LabNode* thisptr 
    cdef PyLabNetwork network 

    def __cinit__(self): 
     self.thisptr = new LabNode() 

    def __dealloc__(self): 
     if self.thisptr: 
      del self.thisptr 

    def SetNetwork(self, PyLabNetwork net): 
     """ 
     Set the network !!! 
     """ 
     self.network = net 

そして "yourextension.so" 再コンパイルします。

次に「sphinx-quickstart」を実行し、質問に答えます。 「オートドック」を求められたら、はいと言うことを忘れないでください。これにより、 "Makefile"、 "index.rst"ファイル、 "conf.py"ファイルが生成されます。

この最後の「conf.pyは、」あなたのモジュールを見つけるためにされたスフィンクスを伝えるために編集する必要があります。

# If extensions (or modules to document with autodoc) are in another directory, 
# add these directories to sys.path here. If the directory is relative to the 
# documentation root, use os.path.abspath to make it absolute, like shown here. 
#sys.path.insert(0, os.path.abspath('.')) 
sys.path.insert(0, os.path.abspath('../../parent/dir/of/yourextension/')) 

「index.rst」ファイルがあるかもしれないどのモジュール伝えるためだけでなく、編集する必要があります分析した:

Contents: 

.. toctree:: 
    :maxdepth: 2 


.. automodule:: yourextension 
    :members: 
    :undoc-members: 
    :show-inheritance: 

最後に実行して、ドキュメントの構築:私のために十分だった

$ make html 

を(私は ".../_ build/html /"ディレクトリにhtmlファイルの結果セットを持っています)。以前の質問から尋ねられて以来、スフィンクスとサイモンが進化しているかもしれませんが、私は対処する "署名"の問題はありませんでした。特定のCythonディレクティブを使用することも、スフィンクスに適用する修正もありません。

編集:まあ、私は私の言葉を取り戻したいと思います。私はEpydocを使っている間に "Danは"埋め込みシグネチャの問題について言及していた(これはSphinxの問題でもあると思います)という問題に遭遇しました。このコンパイラディレクティブはとにかくパイソン準拠した署名を送信しませんアクティベーション:

PyLabNode.SetNetwork(self, PyLabNetwork net) 

これは2欠点があります。クラスのプレフィックスと入力されたパラメータのドット表記を。これは、両方のスフィンクスを助けることができる

def SetNetwork(self, PyLabNetwork net): 
    """ 
    SetNetwork(self, net) 
    Set the net !!! 
    @param self: Handler to this. 
    @type self: L{PyLabNode} 
    @param net: The network this node belongs to. 
    @type net: L{PyLabNetwork} 
    """ 
    self.network = net 

希望:終わり

は、私が正しいものを送信するために見つけ出すことができる唯一の方法は、そのようなドキュメントの文字列の最初の行に準拠した署名を書くことでしたそしてEpydocユーザー...


EDIT:__cinit__に関して、私は説明を倍にすることによって(スフィンクスをしようとしなかった)Epidocで正常にドキュメントを生成することができました、次のように:Golgauthが説明するように

# For Epydoc only (only used for docstring) 
def __init__(self, sim): 
    """ 
    __init__(self, sim) 
    Constructor. 
    @param sim: The simulator this binding is attached to. 
    @type sim: L{PyLabSimulatorBase} 
    """ 

# Real Cython init 
def __cinit__(self, PyLabSimulatorBase sim): 
    self.thisptr = new LabNetBinding() 
    self.sites = [] 
    simulator = sim 
+0

、paramはないコンストラクタで、クラスのドキュメントで文書化されなければならないので、それは生成されたドキュメントでよく見えます。 –

0

、スフィンクスのautodocのモジュールは.soからドキュメンテーション文字列を取り、ない.pyx。あなたがドキュメントを生成する前にPythonモジュールをcythonizingする場所に簡単なビルドに拡張モジュールあるとき、あなたのスフィンクスの設定に変更を加えることなく、あなたのドキュメントを生成する最も簡単な方法:

python setup.py build_ext --inplace 

その方法のautodocのだろう通常のPythonモジュールと一緒に拡張モジュールを見つけて、期待どおりのドキュメンテーションを生成することができます。

sphinx-buildを実行するには、この手順は、拡張モジュールを構築するためにsphinx-quickstartによって生成されたMakefileを編集することができます忘れリスクにさらさないでするには、次の

スフィンクスについて
html: 
    @cd /path/to/setup.py; python setup.py build_ext --inplace 
    ...