You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake中如何将stdout和stderr捕获至日志文件?

问题分析

你的shell命令存在重定向顺序错误,导致echo {input}的输出被最终的1> {log.stdout}覆盖,无法写入目标{output}文件,同时stdout日志的捕获逻辑不符合预期。

正确实现方式

根据你的需求(将命令的stdout/stderr捕获到日志,同时将echo内容写入输出文件),提供两种可行方案:

方案1:同时将echo内容写入输出文件和stdout日志

使用tee命令复制标准输出流,确保内容同时进入输出文件和stdout日志,stderr单独写入对应日志:

configfile: "config.json"

rule all:
  input: expand("{sample}.txt", sample = config["samples"])

rule rule1:
    input:
        lambda wildcards: config["samples"][wildcards.sample]
    output:
        "{sample}.txt"
    log:
        stdout="{sample}.txt.stdout",
        stderr="{sample}.txt.stderr"
    shell:
        "echo {input} | tee {output} > {log.stdout} 2> {log.stderr}"

方案2:仅将echo内容写入输出文件,捕获可能的stderr到日志

如果不需要将echo内容同步到stdout日志,仅需捕获命令的错误输出,可简化重定向:

configfile: "config.json"

rule all:
  input: expand("{sample}.txt", sample = config["samples"])

rule rule1:
    input:
        lambda wildcards: config["samples"][wildcards.sample]
    output:
        "{sample}.txt"
    log:
        stderr="{sample}.txt.stderr"
    shell:
        "echo {input} > {output} 2> {log.stderr}"
补充说明
  • 原命令中echo {input} > {output} 1> {log.stdout}的问题:重定向按从左到右顺序执行,最终stdout被指向log.stdout,导致output文件为空。
  • echo命令通常不会产生stderr,因此stderr日志在仅使用echo时会是空文件,但如果后续替换为其他可能产生错误输出的命令,该写法可正常捕获。

内容的提问来源于stack exchange,提问作者Homap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:13:11