如何解决将环境conda中的shell命令与snakemake工具中的python脚本混合
我想在环境conda中将shell命令与任何Python脚本混合使用,因此无法使用'run'部分...
我尝试过:
shell:"""
gunzip -c {input.ech} | NanoFilt -l {params.min_length} --maxlength {params.max_length} -s {input.summary} -q {params.q} --readtype {params.rd} | gzip > Working_space_ont/01_nanofilt/{wildcards.sample}_filt_{params.q}.fastq.gz
python3 reinit.py
while [[ -f Working_space_ont/01_nanofilt/{wildcards.sample}_filt_{params.q}.fastq.gz ]] && [[ grep -c '>' Working_space_ont/01_nanofilt/{wildcards.sample}_filt_{params.q}.fastq.gz < {params.cov} ]]; do
python3 quality_minor.py
gunzip -c {input.ech} | NanoFilt -l {params.min_length} --maxlength {params.max_length} -s {input.summary} -q {params.q} --readtype {params.rd} | gzip > Working_space_ont/01_nanofilt/{wildcards.sample}_filt_{params.q}.fastq.gz
done
mv Working_space_ont/01_nanofilt/{wildcards.sample}_filt_{params.q}.fastq.gz {output}
"""
我的退出状态1为非零错误
reinit.py:
import yaml
with open("config_wf.yaml") as f:
old_yaml = yaml.load(f)
old_yaml["params"]["filtration"]["quality"] = old_yaml["params"]["filtration"]["quality_fix"]
with open("config_wf.yaml",'w') as f:
yaml.dump(old_yaml,f,default_flow_style=False)
quality_minor.py:
import yaml
with open("config_wf.yaml") as f:
old_yaml = yaml.load(f)
old_yaml["params"]["filtration"]["quality"] -= 1
with open("config_wf.yaml",'w') as f:
yaml.safe(old_yaml,default_flow_style=False)
您对我有什么想法吗?
最好的问候,
伊娃
解决方法
Snakemake Shell不支持循环的bash语法。我看到了两种可能的解决方案。
首先,您可以将此代码包装到 .sh 文件中,然后从shell
部分运行该代码:
shell: "run.sh"
接下来,您可以使用shell
部分中的run
函数运行每个命令:
run:
shell("""gunzip -c {input.ech} | NanoFilt -l {params.min_length} --maxlength {params.max_length} -s {input.summary} -q {params.q} --readtype {params.rd} | gzip > Working_space_ont/01_nanofilt/{wildcards.sample}_filt_{params.q}.fastq.gz""")
shell("python3 reinit.py")
# Implement your logic in Python
...
,
您的python脚本似乎正在更改工作流程的配置yaml,而没有将其直接传递给nanofilt命令。那你有无限循环吗?在snakemake进程开始时会读取配置yaml,因此按规则进行更改应该无效。
您可以通过使用蛇形输入法来尝试实现此功能,方法是对每个失败的参数减小参数的输入函数的尝试,并在过滤不良时使作业失败。
一个更清洁的解决方案是编写一个将nanofilt用作库并包装其执行的python脚本。 main method很简单。建立您的参数并根据需要进行调整,然后所有评估代码和循环都将在python中进行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。