ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

obsidian_vault_template_for_researcher 实战调试笔记:从 2022-05-14 日志看自动化脚本测试与错误排查

obsidian_vault_template_for_researcher 实战调试笔记:从 2022-05-14 日志看自动化脚本测试与错误排查 文档教程知识管理科研【免费下载链接】obsidian_vault_template_for_researcherThis is an vault template for researchers using obsidian.项目地址https://gitcode.com/gh_mirrors/ob/obsidian_vault_template_for_researcher点击查看免费下载本仓库是一套面向研究者的 Obsidian 知识库模板obsidian_vault_template_for_researcher其中01-Diary/日志存档/2022-05-14.md记录了 2022 年 5 月 14 日下午一次大规模功能更新后的完整测试过程从 front-matter 自动补全、双链解析、增强编辑到auto_transfer草稿归档、ref_list引文列表、author_count大牛排名等多个 Python 脚本的实测与排错。阅读本文你将掌握该模板库的核心脚本架构、Templater QuickAdd 终端的三层调用链以及如何通过斜杠命令/test快速定位并修复断言类报错。一、日志背景一次“大更新”的测试日日志的## TODO部分记录了当天的两项任务多喝水、阅读一篇文献但真正的内容集中在## Tracking时间线从 13:53 开始作者标注“这次进行了比较大的更新进行测试一下 #TODO”随后在 14:0114:38 之间逐一验证了愿望清单更新、auto_transfer草稿归档、ref_list参考文献补全、front-matter 自动补全、增强编辑Hsub2/subO下标、格式刷与指定颜色、以及/test斜杠命令的建立。这条时间线本身就是模板库工作流的一个缩影所有自动化脚本都通过 Templater 插件触发再由终端执行最终将正常输出或报错信息回写进当前笔记。这段日志与仓库文档 python代码说明与调试方法 完全对应——该文档明确说明“所有代码在使用时通过 quickAdd 命令触发 Templater 插件然后调用各自系统的 terminal 执行相应的命令”脚本统一存放在08-Assets/Scripts目录且“没有编程基础的用户可通过斜杠命令在任意行开头输入/test找到相关命令会同时在当前页面当前位置打印正常输出和报错信息”。二、核心脚本架构Obsidian 接口与路径约定要理解日志中的每次测试先看脚本的公共底座。所有脚本都从08-Assets/Scripts/obs.py中的Obsidian类获取 Vault 根目录与关键子目录路径class Obsidian: def __init__(self): vdir self.get_vault_rootdir() sdir os.path.join(vdir, 08-Assets, Scripts) self.inputs sys.argv self.paths { vault: vdir, reading: os.path.join(vdir, 02-Reading), project: os.path.join(vdir, 03-Projects), asset: os.path.join(vdir, 08-Assets), script: sdir, csl: os.path.join(sdir, acs-nano.csl), bib: os.path.join(sdir, MyLibrary.bib), docx: os.path.join(sdir, template.docx), css: os.path.join(sdir, markdown.css), }关键点get_vault_rootdir()通过sys.argv[0]找到脚本自身绝对路径再按08-Assets分割得到 Vault 根目录因此脚本无需硬编码绝对路径可以随 Vault 一起迁移到移动硬盘或 U 盘README 中建议的X:\projects\working场景即可直接使用。utils.py中的fetch_front_matter则负责把笔记开头的 YAML front-matter 解析为字典def fetch_front_matter(fp): parts content.split(---\n) if len(parts)1: for item in items: cuts item.split(:) key cuts[0] value :.join(cuts[1:]) info[key] value.strip() return info注意它用split(:)再join的方式取值可以正确处理date: 2022-05-14 13:43:20这类含冒号的值——这正是日志当天测试“front-matter 自动补全好用”的背后实现基础。三、/test斜杠命令调试入口与测试区域日志 14:24 记录“建立 python 代码的测试接口通过斜杠命令在任意行开头输入/test可以找到相关命令会同时打印正常输出和报错信息。”这是模板库刻意设计的“傻瓜式调试法”不需要打开终端、不需要会写代码直接在笔记任意行首输入/testTemplater 会弹出可用的命令列表选择后即可在当前光标位置看到脚本输出或Traceback。日志中的## 测试区域就是这种调试方式的现场证据。作者用![[Pasted image 20220514143721.png#center|通过shellcommands插件进行测试|500]]记录了通过 shellcommands 插件测试的画面对应 [08-Assets/Pasted image 20220514143721.png](https://raw.gitcode.com/gh_mirrors/ob/obsidian_vault_template_for_researcher/raw/7d9d15d3b6c3990c0b756c68ed46b3657a616619/08-Assets/Pasted image 20220514143721.png?utm_sourcegitcode_repo_files)紧接着就粘贴了第一个报错堆栈。这种“截图 报错原文”的测试记录方式使得后续任何人回看日志都能复现问题现场。四、auto_transfer.py草稿归档的 Shortlink 机制与断言报错日志测试区域出现了第一段关键报错Traceback (most recent call last): File ./08-Assets/Scripts/auto_transfer.py, line 103, in module main() File ./08-Assets/Scripts/auto_transfer.py, line 37, in main if isShortLink(target): File ./08-Assets/Scripts/auto_transfer.py, line 53, in isShortLink assert - in target, destination is not a valid path! AssertionError: destination is not a valid path!这段报错与 python代码说明与调试方法 中给出的“destination 错误时”示例完全一致。要读懂它需要先理解auto_transfer.py的完整逻辑该脚本从01-Diary/本周事务目录读取带status: complete的笔记按destination字段把已完成内容移动到目标项目子目录def isShortLink(target): shortlink文件夹前面的唯一数字前缀的组合 如 03-01 就代表是 03-Projects目录下的一个子目录其名称前缀是01 assert - in target, destination is not a valid path! parts target.split(-) # 一级目录必包含 - f2 parts[1] if len(f2)2: return False # 一级目录即便是00-MOCMOC的长度也是3 else: return TrueisShortLink在第 53 行断言target必须包含-这是为了识别“数字前缀短码”。例如仓库中 test3 的 front-matter 为status: complete destination: 03-9803-98即代表03-Projects目录下数字前缀为98的子目录最终会被shortLinkDecode解码为真实路径。日志当天先在 14:08 记录了“新建一个草稿看看 [[test3]]auto_tranfer 测试通过”随后在测试区域贴出的AssertionError属于刻意构造的失败用例——即 destination 字段没有按XX-XX格式书写例如直接写成03-Projects或不含连字符的值从而触发第 53 行断言。这正是模板库文档强调的排错路径看到AssertionError: destination is not a valid path!第一反应就是检查笔记 front-matter 中destination是否为合法的短码格式。补充说明isShortLink对一级目录的长度判断len(f2)2返回 False是为了把00-MOC这类“不含短码的完整路径”排除在短码解析之外而shortLinkDecode中assert len(fullname)1, Folder prefix short code error!则要求数字前缀在同一目录内唯一否则会报Folder prefix short code error!——这是另一个常见的配置错误点。五、ref_list.py引文列表补全与本地文库双链替换日志 14:12 记录“ref_list 功能测试通过[[Doose2005]]”。这对应 Doose2005.md 这一 mdnotes 文献笔记——它的### References一节恰好带Currently 0 references inside library! 2022-05-14的生成标记是当天测试的直接产物。ref_list.py的核心逻辑分为两支mdnotes 文件文件名以开头通过get_citekey_from_filepath从文件名提取 citekey读取本地MyLibrary.bib获取 DOI再向 CrossRef 发起查询本地已有.json缓存则直接复用最终遍历引文 DOI 列表若引文已在本地文库则输出双链[[citekey]]否则输出https://doi.org/xxx链接无 DOI 的条目输出占位提示。核心代码if ref_doi in existed_doi_dict.keys(): # 如果引文已经存在于本地文库则替换为双链 line f{idx1}. [[{existed_doi_dict[ref_doi]}]] count 1 else: ref_url fhttps://doi.org/{ref_doi} if ref_doi.startswith(10.): line f{idx1}. {ref_doi} else: line f{idx1}. This reference does not have DOI print(f\n Currently {count} references inside library! {xxd.query_date})日志中Doose2005的 References 显示Currently 0 references inside library!说明测试时这些引文均不在本地文库中因此全部以 DOI 外链形式呈现——这是符合预期的正常输出。普通笔记草稿等用正则\[\[\([a-zA-Z\-][0-9]{4}[a-z]?)]]从正文提取[[citekey]]双链再在本地 bib 库中查找输出标准引用行。日志## 参考文献一节出现的“Doose2005 Comparison of Photophysical and Colloidal Properties of Biocompatible Semiconductor Nanocrystals Using Fluorescence Correlation Spectroscopy,Analytical Chemistry, date:2005-04-01.”正是这一分支的输出样例——它说明 ref_list 不仅能补全 mdnotes也能为任何草稿正文中的[[xxx]]双链自动生成带标题、期刊与日期的参考文献列表。六、author_count.py大牛排名与越界断言日志测试区域第二段报错Traceback (most recent call last): File ./08-Assets/Scripts/author_count.py, line 58, in module main() File ./08-Assets/Scripts/author_count.py, line 37, in main assert top_nlen(rank), Out of range! AssertionError: Out of range!author_count.py的功能是统计本地 bib 文库中各作者的出现次数并生成大牛排名页面对应 00-MOC/AuthorRanking.md。其执行流程从“大牛通讯录”页面读取 front-matter 中的top_n字段要展示的排名数量遍历MyLibrary.bib全部条目按and拆分多位作者、去除空格后汇总到Counter再按频次排序输出。第 37 行的assert top_nlen(rank), Out of range!是越界保护当top_n设置的大于本地文库实际去重作者总数时rank[i]会越界脚本便主动抛出该断言。也就是说遇到AssertionError: Out of range!时正确做法是调低AuthorRanking页面 front-matter 中的top_n数值或扩充本地 bib 文库而不是修改脚本。日志中还顺带展示了一个细节Zotero 默认把 “last name 在前” 存作者author_count.py通过last_name, first_name name.split(, )拆分并输出[[first_name last_name]]双链如果使用了 Zotero 的茉莉花Jasmine插件合并姓名则走last_name name; first_name 分支。这两种数据形态脚本都已兼容。七、当天测试的其他功能点愿望清单14:01愿望清单.md 通过 dataviewjs 自动收集 Vault 中所有带TODO标签的单行内容并集中展示支持将标签替换为wish等自定义关键词已完成的愿望可改为TODO/完成。当天“完成对 [[愿望清单]] 的更新测试”即验证了这一收集机制。front-matter 自动补全14:15Templater 对 YAML front-matter 字段的自动补全降低手写 front-matter 出错率。增强编辑14:22借助增强编辑插件实现Hsub2/subO下标、格式刷以及把选中文本刷成font color#ED7001指定样式等富文本操作。README 关联README.md 明确指出该模板库推荐 Obsidian v0.14.6关闭安全模式与自动更新后再配合本库内置插件使用本日志所依赖的脚本调用链Templater → QuickAdd → 系统终端即建立在此基础上的。八、调试方法论小结从这则日志可以提炼出该模板库的标准化测试与排错流程入口统一所有脚本由 Templater 触发、终端执行任何脚本问题都可以用笔记内/test斜杠命令复现报错与正常输出都会打印在当前光标位置。报错即线索脚本大量使用assert作为前置条件校验报错消息本身就是配置指引——destination is not a valid path!指向destination短码格式Out of range!指向top_n数值Folder prefix short code error!指向数字前缀唯一性。对照正常输出日志中- [[test3]]auto_transfer 成功移动后输出的双链与- Doose2005 ...ref_list 生成的参考文献行可作为功能正常的验收标准。有编程基础的用户可按 python代码说明与调试方法 的建议用 VSCode 等 IDE 直接打开08-Assets/Scripts目录进行底层调试无编程基础的用户则应先检查 front-matter 配置是否符合脚本断言再参考文档中的常见 issue 列表定位同类问题。这条 2022-05-14 的日志虽然只有一页篇幅却完整呈现了研究者如何在一个 Obsidian Vault 内用“日志 斜杠命令 断言报错”的方式驱动 Python 脚本工具链的迭代验证堪称理解本模板库工作流与调试哲学的最佳入口。赞分享文档教程知识管理科研【免费下载链接】obsidian_vault_template_for_researcherThis is an vault template for researchers using obsidian.项目地址https://gitcode.com/gh_mirrors/ob/obsidian_vault_template_for_researcher点击查看免费下载相关推荐Elasticsearch文档索引完全指南从基础到高级的文档管理技巧 Elasticsearch文档索引完全指南从基础到高级的文档管理技巧 想要掌握Elasticsearch文档索引的核心技术吗这篇终极指南将带你从零开始超全AppImageKit错误排查指南从日志到调试实战超全AppImageKit错误排查指南从日志到调试实战 你是否曾遇到AppImage应用无法启动、闪退或功能异常的问题作为Linux桌面应用的主流打包格式开发工具anti-slop 类型断言三件套入门链式断言、Widen-Then-Assert 与 SAFETY 安全注释怎么过完整指南anti slop 类型断言三件套入门链式断言、Widen Then Assert 与 SAFETY 安全注释怎么过完整指南 anti slop 是一套面文档教程知识管理科研上一篇Go 扩展文件属性xattr库深度解析以 OpenCloud 中的 POSIX 元数据存储实践为例下一篇DataHub File Based Lineage 血缘文件接入指南用 YAML 声明表级与列级数据血缘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表