24

__init__.py私は最近、すべてのモジュール(トップレベルを除く)の名前をに変更し*.pyx、を挿入することによって、私のプロジェクトをCythonizedしext_modules = [Extension('foo', ['foo.pyx'])]ましたsetup.py。ビルドとインストールは正常に機能します。ただし、これを行うcd doc; make htmlと、現在のモジュールをインポートできないため、Sphinxは失敗します*.pyx

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

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

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

SphinxはCythonファイルのdocstringをサポートしていますか?もしそうなら、どうすればこれを機能させることができますか?

4

3 に答える 3

13

ここでは少し混乱しているように見えます。Sphinxは実際には構文アナライザーではありません。Sphinxがdocstringをキャッチできるようにするには、Pythonコードを実行可能にする必要があります。そのため、拡張子ファイルの名前を「.py」に変更しても効果はありません。

さて、私は最近SphinxとCythonと協力していて、私の経験を共有したいと思います...docstringsから特定のコンパイル済みCython拡張機能のhtmlドキュメントの自動生成を取得するための完全な詳細な手順は次のとおりです。

[注:Sphinx1.1.3とCython0.17.4を使用しました]

まず、CythonコードでPythonの「docstrings」を使用します(すべての制限があります。たとえば、コンストラクターを記述できません。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」を実行して質問に答えます。「autodoc」を求められたら、「はい」と言うのを忘れないでください。これにより、「Makefile」、「index.rst」ファイル、および「conf.py」ファイルが生成されます。

この最後の「conf.py」を編集して、Sphinxがモジュールを見つけるように指示する必要があります。

# 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ファイルのセットを取得しました)。前の質問が出されてからSphinxとCythonが進化した可能性がありますが、対処すべき「署名」の問題はありませんでした。使用する特定のCythonディレクティブも、Sphinxに適用する修正もありません...

お役に立てれば。

編集:まあ、私は私の言葉を取り戻したいと思います。Epydocを使用しているときに、「Dan」が「埋め込み署名」の問題について言及していた問題に遭遇しました(したがって、これはSphinxの問題でもあると思います)。このコンパイラ指令をアクティブ化しても、Python準拠の署名は送信されません。

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

これがSphinxとEpydocの両方のユーザーに役立つことを願っています...


編集:に関しては、次のように説明を2倍にすることで、(Sphinxでは試していませんでし__cinit__た)ドキュメントを正常に生成できました。Epidoc

# 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
于 2013-01-18T14:39:58.127 に答える
8

より良い答えを残してください、しかしここに私が見つけた修正があります。

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

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

于 2012-04-08T03:15:45.640 に答える
4

Golgauthが説明しているように、Sphinxのautodocモジュールは、からで.soはなく、からdocstringを取得します.pyx。PythonモジュールをcythonizingするときにSphinx構成を変更せずにドキュメントを生成する最も簡単な方法は、ドキュメントを生成する前に拡張モジュールを適切にビルドすることです。

python setup.py build_ext --inplace

そうすれば、autodocは通常のPythonモジュールと一緒に拡張モジュールを見つけ、期待どおりにドキュメントを生成できるようになります。

この手順を忘れないように、実行する前に、Makefileによって生成されたを編集sphinx-quickstartして拡張モジュールをビルドできsphinx-buildます。

html:
  @cd /path/to/setup.py; python setup.py build_ext --inplace
  ...
于 2013-12-09T14:17:13.467 に答える