如何记录上readthedocs用Cython功能(how to document cython f

2019-07-03 14:46发布

在ReadTheDocs我不允许编译cython扩展,是有可能配置sphinx ,以从中提取文档字符串cython文件,而无需实际编制呢?

谢谢!

Answer 1:

我面临着同样的问题,发现它现在可以收集关于readthedocs用Cython扩展。

答案很简单:用Cython模块可以使用readthedocs提供的virtualenv功能进行编译。

对于稍长的答案和示例项目见下文。

问题是什么?

正如我的理解是,狮身人面像将导入应当记录该项目的所有模块,然后提取文档字符串Python编写的。 这对于失败的模块用Cython,因为他们不能直接进口,必须先编译。 编译的模块不制定出readthedocs的方块,但他们所提供的工具来实现这一点。

如何解决这个问题。

当在virtualenv中安装工程,用Cython模块将建设(成.so文件),然后可以导入。 这可能需要尽管一些外部模块(numpy的下面的例子,当然,用Cython)。 这些可以在指定PIP需求文件 ( requirements.txt有在你的资料库)。

  1. 启用该选项install your project inside a virtualenv管理 -对readthedocs> 高级设置
  2. 输入您的路径requirements.txt相对于项目的根( docs/requirements.txt在下面的例子)
  3. (如果有必要改变Python解释器版本)

现在,您的项目将被安装(使用python setup.py install )每次文档建立。 安装脚本的输出可以设置下的输出可以看到,如果你在相应的构建点击在readthedocs该版本选项卡。 这是编译时错误可能出现。 介意编译项目可能需要一些时间。

示例项目

Python包包括几个用Cython模块,每个模块都有谷歌风格的文档字符串 。

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

买者(S)

虽然试图在这个项目中,我遇到了,我用Cython模块无法导入的问题。 狮身人面像的错误信息读取,如:

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的建议在这里 。 这在当地建立了的时候解决我的问题(其中我编译使用我的项目python setup.py build_ext --inplace ),但在virtualenv中安装时,它指向错误的版本my_package的(即来源,而不是安装的软件包)。 还有狮身人面像找不到任何.so文件导入。

为了解决这个问题,就完全删除线。

我希望这有帮助。



Answer 2:

你可以模拟出依赖于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()


文章来源: how to document cython function on readthedocs