Snakemake:script调用ln命令未改代码却触发重跑的原因咨询
问题原因分析:Snakemake重复触发"Code has changed since last execution"
核心原因是Snakemake默认用脚本内容的哈希值来判断规则是否需要重跑,而非仅依赖文件修改时间,而你的link.py执行ln -s的操作干扰了哈希计算的一致性:
- 当
link.py创建软链接时,如果软链接的路径关联到脚本所在目录,或者脚本文件本身被软链接的创建/存在影响了读取逻辑,会导致Snakemake两次计算脚本哈希时得到不同结果,误判为“代码已更改”。 - 换成
shell直接执行ln时,Snakemake追踪的是规则内的shell命令文本哈希,只要命令没改,哈希就稳定,不会触发重跑。 - 脚本里执行
echo、cat这类命令时,没有修改或创建可能干扰脚本自身哈希计算的文件/链接,哈希值一致,自然不会误触发重跑。
--rerun-triggers mtime参数强制Snakemake只通过文件修改时间判断代码变化,因为你的脚本本身没修改,mtime不变,所以能绕过哈希计算的异常。另外Snakemake 8.x版本在处理涉及软链接的脚本哈希计算时,可能存在逻辑bug,导致这种误判场景出现。
内容的提问来源于stack exchange,提问作者ManJi
相关产品推荐
相关产品推荐

