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

WDL脚本遍历fastq ID文本文件未执行命令问题排查求助

问题排查:WDL脚本未执行预期命令

我需要WDL脚本读取存储fastq文件ID的txt文件,将这些ID代入命令执行。目前脚本运行无报错,但实际命令并未执行。以下是相关代码和文件内容:

原WDL代码

version 1.0

workflow SampleLoop {
input {
File sampleFile
String outputDir
Int qualityThreshold
Int numProc
}

call FilterSeq {
input:
sample = read_lines(sampleFile),
outputDir = outputDir,
qualityThreshold = qualityThreshold,
numProc = numProc
}
}

task FilterSeq {
input {
Array[String] sample
String outputDir
Int qualityThreshold
Int numProc
}
command <<<
for s in ${sample};
do
FilterSeq.py quality -s ${outputDir}/${s}_R1.fq -q ${qualityThreshold} --log ${s}_R1_quality_log --outdir ${outputDir} --nproc ${numProc}
done
>>>
runtime {
continueOnReturnCode: true
}
}

原inputs.json

{
  "SampleLoop.outputDir": "~/pipeline/test",
  "SampleLoop.numProc": "28",
  "SampleLoop.sampleFile": "~/pipeline/fastqs.txt",
  "SampleLoop.qualityThreshold": "20"
}

fastqs.txt内容

A11-A11_BD801
A11-A11_BD836
A12-A12_BD801
A12-A12_BD836
A13-A13_BD801
A13-A13_BD836
A14-A14_BD801
A14-A14_BD836
A15-A15_BD801
A15-A15_BD836

问题原因及修复方案

1. 数组变量的shell展开错误

WDL中的sample是数组类型,直接用${sample}在shell循环中展开时,WDL会将数组转换为单个空格分隔的字符串,但shell会把整个字符串当作单个循环变量,导致循环未正确遍历每个样本ID。

修复:使用WDL的sep=" "语法将数组元素用空格分隔,确保shell能正确遍历:

for s in ~{sep=" " sample};

2. 输入参数类型不匹配

WDL workflow定义的numProc和qualityThreshold是Int类型,但inputs.json中传入的是带引号的字符串值,可能导致隐性类型错误,影响命令执行。

修复:修改inputs.json中的数值参数为整数类型(去掉引号):

{
  "SampleLoop.outputDir": "~/pipeline/test",
  "SampleLoop.numProc": 28,
  "SampleLoop.sampleFile": "~/pipeline/fastqs.txt",
  "SampleLoop.qualityThreshold": 20
}

3. 错误掩盖设置

continueOnReturnCode: true会让任务即使返回非0退出码也标记为成功,可能掩盖FilterSeq.py执行失败的错误,导致看起来命令未执行实际是报错被忽略。

修复:暂时注释或移除该设置,先查看任务日志确认是否有命令执行错误,确认正常运行后再根据需求调整。


修改后的完整WDL脚本

version 1.0

workflow SampleLoop {
input {
File sampleFile
String outputDir
Int qualityThreshold
Int numProc
}

call FilterSeq {
input:
sample = read_lines(sampleFile),
outputDir = outputDir,
qualityThreshold = qualityThreshold,
numProc = numProc
}
}

task FilterSeq {
input {
Array[String] sample
String outputDir
Int qualityThreshold
Int numProc
}
command <<<
for s in ~{sep=" " sample};
do
FilterSeq.py quality -s ${outputDir}/${s}_R1.fq -q ${qualityThreshold} --log ${s}_R1_quality_log --outdir ${outputDir} --nproc ${numProc}
done
>>>
runtime {
# continueOnReturnCode: true
}
}

额外验证步骤

  • 检查outputDir路径是否存在,以及脚本是否有写入权限
  • 确认FilterSeq.py在任务运行环境中可正常调用(可使用绝对路径避免PATH问题)
  • 查看任务执行日志,确认FilterSeq.py命令是否被正确生成并执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:14:52