你在这里看起来有点困惑。Sphinx 并不是真正的句法分析器。您的 Python 代码必须可运行才能使 Sphinx 能够捕获文档字符串。这就是为什么将扩展文件重命名为“.py”没有帮助。
好吧,我最近一直在使用 Sphinx 和 Cython,并想分享我的经验......这是从 docstrings 为给定的已编译 Cython 扩展自动生成 html 文档的完整详细过程:
[注意:我使用了 Sphinx 1.1.3 和 Cython 0.17.4]
首先,在 Cython 代码中使用 Python 的“文档字符串”(具有它可能具有的所有限制 - 例如,您无法描述构造函数。请参阅文档字符串规范):
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”提到的关于“embedsignature”问题的问题(所以我认为这也是 Sphinx 的问题)。激活此编译器指令无论如何都不会发送符合 python 的签名:
PyLabNode.SetNetwork(self, PyLabNetwork net)
这有两个缺点:类前缀和类型参数的虚线表示法。
最后,我能想出发送正确的唯一方法是在文档字符串的第一行写一个兼容的签名,如下所示:
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 用户......
编辑:关于__cinit__
,我能够通过加倍描述成功地生成文档Epidoc
(没有尝试使用 Sphinx),如下所示:
# 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