在 Windows 上, SessionStart/Stop 钩子经常超时 — 热心的 CLI 导入 + 禁用字节码缓存使每次调用都需要支付完整的解释器和导入成本
作者: ppuri2创建于 2026年8月17日更新于 2026年9月10日
- 在
scripts/Claude-obsidian.py中设置sys.dont_write_bytecode = True可禁用 Python 的.pyc缓存,因此每次调用钩子都会从源代码重新编译所有导入的模块,而不是在第一次运行后重新使用缓存。 - 在
claude_obsidian/cli.py中,无论调用哪个子命令,都会积极导入约 13 个子模块(capture、checkpoint、contracts、extensions、gates、ledgers、lint_engine、mode_config、package_validation、release、transaction、vault_ops,以及hook_adapter)。hook session-start/hook stop路径只需要hook_adapter,其他约 12 个模块在该路径上是多余的负担。 - 在 Windows 上,
python3通常会优先解析到 Store 应用执行别名代理(...\AppData\Local\Microsoft\WindowsApps\python3.exe),而不是在 PATH 上的真实解释器,这在 Python 启动之前就增加了自己的启动开销。通过where python3和Get-Command python3 -All在我的机器上验证了此解析顺序。 以上任何一个因素都无法完全解释 5-21 秒的实际时间超时(我的独立运行保持在 1.5 秒以内),因此我怀疑存在竞争:在实际的会话开始时,此钩子与 Claude Code 连接 MCP 服务器并加载其他插件/钩子同时运行。如果涉及防病毒实时扫描(考虑到与墙时长相比 CPU 时间几乎为零,并且已禁用.pyc缓存,因此每次都会新鲜读取文件),则这种竞争会显著加剧。
内容来源: AgriciDaniel/claude-obsidian