Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在readthedocs上记录cython函数_Python_Cython_Python Sphinx - Fatal编程技术网

Python 如何在readthedocs上记录cython函数

Python 如何在readthedocs上记录cython函数,python,cython,python-sphinx,Python,Cython,Python Sphinx,在上,我不允许编译cython扩展名,是否可以配置sphinx,以便从cython文件中提取docstring,而不实际编译它们 谢谢 将以下代码段添加到您的conf.py: import sys class Mock(object): def __init__(self, *args, **kwargs): pass def __call__(self, *args, **kwargs): return Mock() @classm

在上,我不允许编译
cython
扩展名,是否可以配置
sphinx
,以便从
cython
文件中提取docstring,而不实际编译它们

谢谢

将以下代码段添加到您的
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()

我遇到了同样的问题,发现现在可以在readthedocs上编译Cython扩展

简短回答:Cython模块可以使用readthedocs提供的virtualenv功能进行编译

有关稍长的答案和示例项目,请参见下文

有什么问题? 据我所知,sphinx导入项目中所有需要记录的模块,然后用python提取docstring。这对于Cython模块是失败的,因为它们不能直接导入,必须先编译。在readthedocs上编译模块并不是开箱即用的,但它们提供了实现这一点的工具

如何解决这个问题。 在virtualenv中安装项目时,Cython模块将构建(到.so文件中),然后可以导入。不过,这可能需要一些外部模块(下面的例子是numpy,当然还有Cython)。这些可以在存储库中的(
requirements.txt
)中指定

  • 在readthedocs上的Admin->Advanced Settings(管理->高级设置)下启用选项
    在VirtualNV中安装项目
  • 输入相对于项目根目录的
    requirements.txt
    docs/requirements.txt
    在下面的示例中)
  • (如有必要,更改python解释器版本)
  • 现在,您的项目将在每次生成文档时安装(使用
    python setup.py install
    )。如果在readthedocs上的Builds选项卡中单击相应的Builds,则可以在setup output下看到安装脚本的输出。这就是编译时错误可能出现的地方。请注意,编译项目可能需要一些时间

    示例项目 一个Python包,由几个Cython模块组成,每个模块都有

    requirements.txt 警告(s) 在我的项目上尝试这个时,我遇到了一个问题,我的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
    ...
    
    根据建议,转到my
    conf.py
    。这解决了我在本地构建时的问题(在这里我使用
    python setup.py build\u ext--inplace
    )编译了我的项目),但在virtualenv中安装时,这指向了错误版本的myu包(即源代码,而不是安装的包)。sphinx在那里找不到任何要导入的.so文件

    要解决此问题,只需完全删除该行


    我希望这有帮助。

    啊,对不起,我误读了你的评论,我以为你想避免RTD中不存在的C扩展相关的错误,所以我的评论无法回答你的问题。欢迎访问该网站!这是一个很好的第一个答案。谢谢,我会在有时间的时候测试它,然后接受答案!
    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
    ...