将环境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中进行。