Sphinx入门

2023-05-16

文章目录
Sphinx画流程图和时序图

最近在使用sphinx的时候遇到了一点问题,首先是不支持中文检索,为此进行了一些配置,参考链接
首先安装jieba库,python3的安装命令是:pip install jieba3k,然后把sphinx项目的conf.py文件中的language键值改为 zh_CN,再进行编译应该就可以了。

配置完之后发现很多目录的内容依旧没有检索到,于是决定稍微深挖一下sphinx在编译的过程中是怎么寻找内容并构建索引的(结论在此)。

首先定位到sphinx的安装目录,并进入这个目录:

import sphinx
print(sphinx.__file__)

跟搜索相关的文件在search/目录下

sphinx-autobuild命令是按字典序升序,深度优先搜索每个目录下的每一个rst文件,依次进行构建;检索到的文件会在编译过程中用绿色字体标示出来。当然,如果我们没有手动对sphinx的代码进行修改,添加一些print语句,编译过程基本都是在同一行内显示,每个文件就闪一下就过去了,基本是看不到的。

接下来一段提及的内容都属于search/__init__.py文件中的代码:
visitor.found_title_words返回每个文档的标题文字,标题包括每个文档的开头标题和每一个用=====-----+++++等修饰的文字。
IndexBuilder在初始化后,它的lang成员根据sphinx项目目录下conf.pylanguage键值的不同,可能是SearchEnglish类也可能是SearchChinese类。对IndexBuilder的调用是在builders/html/__init__.py里头;

self.indexer = IndexBuilder(self.env, lang,
                            self.config.html_search_options,
                            self.config.html_search_scorer)
self.load_indexer(docnames)

第一行的参数没有什么特别,第二个是语言,后两个是空的;docnames是所有的rst文件的路径,load_indexer()函数依次给出每个文件的指针,并调用IndexBuilderload()方法令其按sphinx.search._JavaScriptIndex 的方式读取文件,得到的变量frozen有很多个键值,这里只挑对我们有用的键值出来讲:

docnames: 一个list,包含rst文件在sphinx文档树中的路径(又名索引index),如best_practices/git
filenames: 一个list,包含rst文件的实际相对路径,如best_practices\git.rst
titles: 一个list,包含所有rst文件的大标题(每个文件只有一个大标题)
docnames,filenames和titles三者是一一对应的,顺序也是相同的
objtypes: 一个dict,看起来像是固定的,内容为 {'0': 'py:attribute', '1': 'py:class', '2': 'py:method'}
objnames: 一个dict,与objtypes相对应,内容为 {'0': ['py', 'attribute', 'Python 属性'], '1': ['py', 'class', 'Python 类'], '2': ['py', 'method', 'Python 方法']}
titleterms: 一个{str: int/list}的dict,保存的是由标题分词得到的索引词与titles所指页面的对应关系,例如{"位置": [4, 27, 32]}表示位置这个词出现在了titles[4], titles[27], titles[32]所对应的三个页面中,也即三个检索结果。需要注意的是,虽然titles只包含了大标题,但titleterms里头是有包含小标题的分词结果的,也即小标题可以正常搜索,正常对应到某个页面
terms: 与titleterms相似,唯一的不同是它保存了由正文分词得到的索引词与titles所指页面的对应关系
objects: 一个{name: list[list]}的dict,保存被autoclassautomodule等引用的模块和类,形如{'mixedai.sys_layer.log': [[26, 0, 1, '', 'logger']], ...},key是模块名,相当于from xxx import yyy里面的xxx,value是嵌套list,每个list是一条引用,26表示title[26]对应的页面,‘logger’是yyy;第二项的0与前面objtypes内容相对应,0是属性,1是类,2是方法。第三项和第四项的1和’'没有看出啥名堂来,每一条这两项都是一样的。

回到load()方法,self._filenamesself._titles分别保存了索引(这里的索引是指形如best_practices/git的字符串)与文件名、标题名称的对应关系,self._mappingself._title_mapping分别保存了正文分词、标题行分词与索引index的对应关系,到这里就准备好检索所需的材料了。

stem()函数在分词之后执行,对分词结果做预处理,如统一变为小写等,这样可以将同类项合并到一个索引中,提高搜索效率和准确度。

接下来一段提及的内容都属于search/zh.py文件中的代码:
search/zh.py是针对中文检索的文件,支持jieba库;self.latin_terms在每次分词的时候都会收录分出来的英文单词,在stem环节用来判断需不需要做stem。由于我没有看到过这个条件生效的情况,should_not_be_stemmed一直都是False,所以这点暂时不管。

结论:要想支持中文检索,安装jieba3k库就万事大吉了。之所以看起来搜到的结果不够完整, 是因为要保持搜索结果有条理,所以同一个html页面如果出现多次搜索词,只会显示为一条结果,但在点进该页面时会高亮显示每个匹配的词。

如果检索失败,查看编译结果目录下的searchindex.js文件,有\uxxxx字样就是有中文检索材料,应该是可以检索出来的,没有的话要再回去看看中间过程。

Sphinx画流程图和时序图

需要借助sphinxcontrib-plantuml插件:pip install sphinxcontrib-plantuml,同时在conf.py中做一些配置:

extensions = [
    'sphinxcontrib.plantuml',
]
plantuml = 'java -jar plantuml.1.2021.12.jar'

plantuml的jar文件下载地址在这
另外需要安装jdk,我们需要在Docker中安装jdk,这里使用Docker构建jdk1.8镜像,参考链接。然后还要安装graphviz,不然只能画时序图跟活动图。
Linux版jdk点此下载,提取码是idyn,资源来自此链接中的评论。

切换主题
这里有很多内置主题,在写普通uml语句的时候通过!theme bluegray导入主题,现在是在sphinx的一个插件里头使用,它只支持!include命令,因此只能手动把.puml文件拉到本地,使用!include命令导入主题文件。这里提供了内置主题的快速预览。

plantuml官方教程,图文并茂

plantuml刚装好的时候找不到中文,中文会显示成方块,需要安装一下,参考链接

以上n多步最终的Dockerfile如下,ADD涉及的文件都需要手动下载,下载链接在参考链接中或上文中:

FROM xxxx
RUN mkdir /usr/local/jdk && mkdir /usr/local/packages && mkdir -p /usr/share/fonts/simsun && pip install sphinxcontrib-plantuml && apt-get install -y graphviz fontconfig xfonts-utils
ADD jdk-8u281-linux-x64.tar.gz /usr/local/jdk
ADD plantuml.1.2021.12.jar /usr/local/packages
ADD plantuml_official_themes/ /usr/local/packages/plantuml_official_themes/
ADD plantuml-style-c4/ /usr/local/packages/plantuml-style-c4/
ADD simsun.ttc /usr/share/fonts/simsun

RUN mkfontscale && mkfontdir && fc-cache -fv && /bin/bash -c "source /etc/profile"

ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_281
ENV JRE_HOME /usr/local/jdk/jdk1.8.0_281/jre
ENV PATH $JAVA_HOME/bin:$PATH

第一行代码的开头不可以是中文,否则中文会全部变方块,不在第一行就没事,很神奇(后面重新做了一个容器又没有这个问题了,不知道是怎么一回事)

plantuml样式表,所有能改的参数都在这里了

在容器中使用sphinx-autobuild时报错:OSError: [Errno 28] inotify watch limit reached,这个是宿主机的配置的问题,在宿主机上进行如下配置即可(参考链接1,参考链接2):

# 查看当前的配置,默认值是8192
cat /proc/sys/fs/inotify/max_user_watches
# 临时更改,重启后会失效
sudo sysctl fs.inotify.max_user_watches=1048576
# 永久更改,在文件后面添加一句 fs.inotify.max_user_watches=1048576
sudo vim /etc/sysctl.conf

一些让人摸不着头脑的警告:

  • WARNING: Definition list ends without a blank line; unexpected unindent.
def func1(self, p1, p2, p3, p4):
    """ balabala.
    Args:
        p1: xxx
        p2: xxx
        p3: xxx
    """

注释换行的时候,要跟"""对齐,而不是跟第一个单词对齐,因此要把第三行的e.g跟Args对齐,就不会报warning了。
再来看第二个例子:

def func2(self, p1, p2, p3, p4, p5):
    """balabala
    This method will create the following files:
        1. p1p1
        2. p2p2

    Args:
        name: xxx

    Returns:
        str: xxx
    """

也是类似的原因,把1.与2.跟This对齐就不报warning了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sphinx入门 的相关文章

  • Sphinx入门

    文章目录 Sphinx画流程图和时序图 最近在使用sphinx的时候遇到了一点问题 xff0c 首先是不支持中文检索 xff0c 为此进行了一些配置 xff0c 参考链接 首先安装jieba库 xff0c python3的安装命令是 xff
  • VScode+Sphinx+ReadTheDocs 从环境搭建到放弃

    概述 此篇博客用来记录在windows10中配置环境的过程 xff0c 注意是Windows下 xff0c 我没有在Linux下面尝试过配置 一下参考了各路教程加上自己亲测 xff0c 应该是没有问题的 被掏空 目录 概述 目录材料清单工具
  • Sphinx使用说明

    link https blog csdn net sinat 29957455 article details 83657029 1 安装插件 xff1a pip3 install sphinx pip3 install sphinx rt
  • Python: 使用sphinx生成python项目文档

    Python 使用sphinx生成python项目文档 前言安装sphinx生成配置文件修改配置文件生成rst文件编译文档 前言 本篇记录使用sphinx生产成python项目文档的方法 安装sphinx 直接通过pip安装sphinx x
  • Sphinx index.rst

    假设我们有两个文本file1 rst和file2 rst他们的内容如下 file1 rst span class hljs header file1 title1 61 61 61 61 61 61 61 61 61 61 61 61 sp
  • sphinx+reStructuredText 文档写作

    文章目录 1 简介spinxreStructuredText rst 写作环境配置参考文档 1 简介 spinx Sphinx 是一种文档工具 xff0c 它可以令人轻松的撰写出清晰且优美的文档 由 Georg Brandl 在BSD 许可
  • sphinx 文档_Sphinx轻松漂亮的文档

    sphinx 文档 Sphinx是允许开发人员以纯文本格式编写文档的工具 xff0c 可轻松生成满足各种需求的格式的输出 使用版本控制系统跟踪更改时 xff0c 这将很有帮助 纯文本文档对于跨不同系统的协作者也很有用 纯文本是当前可用的最可
  • reStructuredText 、Sphinx 资料汇总

    reStructuredText 用 reStructuredText 写作 xff1a 快速入门指南 reStructuredText rst 快速入门语法说明 reStructuredText rst 语法规则快速入门 在线 reStr
  • KaTeX使用

    前言 在 KaTeX KaTeX KATE X官网 有两张支持表 这里搬运过来以便于大家能够正确使用指令 这张表应该涵盖了纯 KaTeX KaTeX KATE X所有的功能 当然
  • Sphinx——自动生成Python文档

    Sphinx是一个可自动生成python项目api的工具 使用起来也比较简单 只需要在项目上进行简单的配置 即可生成项目的api文档 简介 Sphinx是Python文档生成器 它基于reStructuredText标记语言 可自动根据项目
  • 狮身人面像和“你的意思是……?”建议想法。它会起作用吗?

    我正在尝试想出最快的方法来提出搜索建议 起初我认为 Levenstein UDF 函数与 mysql 表相结合就可以完成这项工作 但是使用 levenshtein mysql 必须遍历表中的每一行 大量的单词 这会使查询非常慢 现在我最近安
  • 跨多个模型搜索多个单词

    我正在尝试在网站中创建搜索功能 并且希望用户能够搜索多个单词 根据各种模型中存在的条件执行子字符串匹配 为了这个例子 假设我有以下模型 Employee Company 市政府 County 一个县有多个市 其中有多家公司 有多名员工 我希
  • 使用 MySQL Fulltext(或 sphinx?)进行模糊街道地址搜索[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个数据库表 其中包含来自 Google 地图地理编码响应的地址 Google 缩写了所有方向 西 gt W 东 gt E 等 因
  • Sphinx搜索排名破了?

    有人曾经使用过 Sphinx 排名选项吗 我已经阅读了手册和书籍 但根本无法进行排名 据我了解 排名只是以不同的方式计算权重 不进行任何类型的排序 我的结果按 weight 内部sphinx字段 排序并使用扩展排序模式 您需要这样做 但看不
  • Sphinx 2.0.2 过滤 sql_attr_string 属性

    首先 我要说的是 我知道http sphinxsearch com docs current html conf sql attr string http sphinxsearch com docs current html conf sq
  • Sphinx:警告:属性计数为 0:切换到无 docinfo

    我是 Sphinx 的新手 我似乎无法弄清楚这个警告指的是什么或如何解决它 谷歌搜索没有提供太多信息 所以我希望这里的数据库专家知道如何解决这个问题 Thanks 没有什么可害怕的 该消息表示 由于缺少这些属性 配置文件中设置的附加属性存储
  • Sphinx 过滤器 - 过滤器属性之间可以有“OR”吗?

    我正在使用 sphinx 列出数据库中的一些项目 几乎100 我只是还没弄清楚如何创建一个OR两个不同的过滤器之间 例如 我在数据库中的对象有开始日期和结束日期 我可以filter starting date x y and filter
  • Sphinx .net 实现

    是否可以在 net MSSQL 应用程序中实现Sphinx 全文搜索 如果是这样 任何帮助如何实现相同的 一个小的描述将会有很大帮助 我们正在使用 SphinxConnector NET http www sphinxconnector n
  • 在 MySQL 和 Python 中以可重复的方式处理 1970 年之前的日期

    在我的 MySQL 数据库中 我的日期可以追溯到 1700 年代中期 我需要以某种方式将其转换为类似于 Unix 时间的格式的整数 int 的值并不重要 只要我可以从数据库或用户输入中获取日期并生成相同的 int 即可 我需要使用 MySQ
  • Sphinx警告预加载:无法打开

    我安装了sphinx搜索服务 为了创建索引 我使用下一个命令 sudo searchd c etc sphinxsearch sphinx conf 在终端中收到警告消息后 使用配置文件 etc sphinxsearch sphinx co

随机推荐

  • 关于后续部分

    关于算法这块基本上算是读完了 xff0c 只能从大致上理解下了 xff0c 毕竟代码不是自己写的没有最直接的感受 xff0c 那么我们来回顾下 xff0c 试着从整体上来理解下匿名代码除了最上层之外的部分 最上层也就是包含main c在内的
  • cmake:设置编译选项

    此文为 xff1a 轻松入门cmake系列教程 常用 1 cmake debug和release设置 span class token macro property span class token directive hash span
  • cmake:pkg_check_modules

    此文为 xff1a 轻松入门cmake系列教程 理论 是什么 xff1f pkg check modules是 CMake 自己的 pkg config 模块的一个用来简化的封装 xff1a 你不用再检查 CMake 的版本 xff0c 加
  • Unix/Linux编程:针对目录文件描述符的相关操作

    始于版本2 6 16 xff0c Linux内核提供了一系列新的系统调用 xff0c 在执行与传统系统调用相似任务的同时 xff0c 还提供了一些附加功能 xff0c 对某些应用程序非常有用 新 接 口类似的传统接口备 注faccessat
  • ROS:参数服务器通信

    为什么需要 在机器人开发中 xff0c 会有很多参数和设置可以后期需要调整的 xff0c 如果都放到源码里很难实现动态修改和管理 xff0c ROS2为了解决这一问题 xff0c 提出了参数这一通信机制 是什么 如何理解 参数 xff1f
  • MySQL面试:查询性能的优化方法

    实践中如何优化MySQL 四条从效果上第一条影响最大 xff0c 后面越来越小 SQL语句以及索引的优化数据库表结构的优化系统配置的优化硬件优化 查询性能的优化方法 减少请求的数据量 只返回必要的列 xff1a 最好不要使用 SELECT
  • 基础:怎样理解Linux软中断

    软中断 softirq CPU使用率升高也是最常见的一种性能问题 从 取外卖 看中断 中断是系统用来响应硬件设备请求的一种机制 它会打断进程的正常调度和执行 xff0c 然后调用内核中的中断处理程序来响应设备的请求 为什么要有中断呢 xff
  • HTTP:HTTP报文是什么样子的

    引言 如果说HTTP是因特网的信使 xff0c 那么HTTP报文就是它用来搬东西的包裹了HTTP报文是在HTTP应用程序之间发送的数据块 这些数据块以一些文本形式的元信息 meta information 开头 xff0c 这些信息模式了报
  • ROS:服务通信

    话题通信的数据传输是单向的 xff0c 订阅端被动接收发布端的数据 这时候有人就问了 xff0c 如果发布端想主动接收数据怎么办 ROS中提供了另一种通信方式 xff1a 服务通信 ROS xff1a 通信模型 Service通信是双向的
  • linux操作系统:线程,令复杂的项目并行执行

    为什么要有线程 其实 xff0c 对于任何一个进程来讲 xff0c 即使我们没有主动去创建线程 xff0c 进程也是默认会有一个主线程的 线程是负责执行二进制指令的 xff0c 它会根据项目执行计划书 xff08 二进制文件 xff09 一
  • 存储创建及openstack对接——LVM

    说明 本方案是在每一个计算节点 上安装cinder volumes组件来完成对本地存储的管理 若无特殊说明 xff0c 以下步骤仅在计算节点执行 1 前期准备 检查计算节点是否安装 lvm xff0c iscsi 磁盘分区和格式化 裸盘不能
  • clion:输出中文乱码终极解决方案

    临时解决方案 如果在windows时发现clion乱码 xff0c 可以在cmakelist txt中 xff1a c 43 43 在cmakelist txt添加set CMAKE CXX FLAGS 34 CMAKE CXX FLAGS
  • ROS:节点

    节点 ROS xff1a 节点是什么 机器人是各种功能的综合体 xff0c 每一项功能就像机器人的一个工作细胞 xff0c 众多细胞通过一些机制连接到一起 xff0c 成为了一个机器人整体 在ROS中 xff0c 我们给这些 细胞 取了一个
  • VSCode:配置C/C++开发环境

    准备 区分编辑器 编译器 IDE xff1a 作者 xff1a C语言教学 编辑器就是处理文本 xff08 源码 xff09 的程序 xff0c 写代码写的就是文本 xff0c 编辑器可能提供智能提示 代码高亮等辅助功能 xff0c 但不负
  • NXP MIMXRT1052CVL5B + 正点原子 + MCUXpresso IDE 开发环境搭建

    NXP MIMXRT1052CVL5B 43 正点原子 43 MCUXpresso IDE 开发环境搭建 说明资料准备一切就绪 xff0c 搞他安装 IDE 及生成基本工程安装 J Link 及配置开始调试下载点击 运行 按钮 xff0c
  • c语言学习笔记(1) C语言库函数

    1 xff1a ASLL可现实字符 2 xff1a c文件 span class token macro property span class token directive hash span span class token dire
  • 查看ROS的版本

    查看ROS的版本 启动ROS核心 xff1a roscore获取ROS参数 xff1a rosparam get rosdistro
  • ROS 版本选择和安装

    文章目录 声明 xff1a ROS 的版本选择ROS 的安装ROS 的安装方式软件源安装步骤 声明 xff1a 本文中的内容参考了市面上绝大多数畅销的ROS书籍 xff0c 本文只作个人学习记录和学习分享使用 xff0c 不作任何商业用途
  • 数据结构(考研&面试)

    数据结构和算法 xff08 持续更新 xff09 参考清华大学严蔚敏数据结构与算法 适用于考研 amp 求职 数据结构与算法JAVA落地版 Java 数据结构与算法 xff08 代码实现 下载链接 xff09 本教程全部采用C语言实现 1
  • Sphinx入门

    文章目录 Sphinx画流程图和时序图 最近在使用sphinx的时候遇到了一点问题 xff0c 首先是不支持中文检索 xff0c 为此进行了一些配置 xff0c 参考链接 首先安装jieba库 xff0c python3的安装命令是 xff