Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Snakemake-如何将输入文件的每一行用作通配符_Python_Snakemake - Fatal编程技术网

Python Snakemake-如何将输入文件的每一行用作通配符

Python Snakemake-如何将输入文件的每一行用作通配符,python,snakemake,Python,Snakemake,我对使用Snakemake非常陌生,我已经环顾四周,看看下面是否有解决方案-我几乎非常接近解决方案,但还没有 我有一个包含SRA id列表的单列文件,我想使用snakemake定义我的规则,以便该文件中的每个SRA id都成为命令行上的一个参数 #FileName = Samples.txt Samples SRR5597645 SRR5597646 SRR5597647 蛇形档案如下: from pathlib import Path shell.executable("bash") imp

我对使用Snakemake非常陌生,我已经环顾四周,看看下面是否有解决方案-我几乎非常接近解决方案,但还没有

我有一个包含SRA id列表的单列文件,我想使用snakemake定义我的规则,以便该文件中的每个SRA id都成为命令行上的一个参数

#FileName = Samples.txt
Samples
SRR5597645
SRR5597646
SRR5597647
蛇形档案如下:

from pathlib import Path
shell.executable("bash")
import pandas as pd
import os
import glob
import shutil

configfile: "config.json"

data_dir=os.getcwd()

units_table = pd.read_table("Samples.txt")
samples= list(units_table.Samples.unique())

#print(samples)

rule all:
    input:
           expand("out/{sample}.fastq.gz",sample=samples)

rule clean:
     shell: "rm -rf .snakemake/"

include: 'rules/download_sample.smk'
下载_sample.smk

rule download_sample:
    """
    Download RNA-Seq data from SRA.
    """
    input: "{sample}"
    output: expand("out/{sample}.fastq.gz", sample=samples)
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {input} --threads {params.threads} --outdir {params.outdir}  --gzip "
我尝试了上述代码的许多不同变体,但在某些地方我弄错了

我想要的是:对于Samples.txt文件中的每个记录,我想要并行fastq dump命令运行。因为Samples.txt中有3条记录,所以我希望执行这3条命令

parallel-fastq-dump --sra-id SRR5597645 --threads 16 --outdir out --gzip
这就是我得到的错误

snakemake -np
WildcardError in line 1 of rules/download_sample.smk:
Wildcards in input files cannot be determined from output files:
'sample'

提前感谢

第一个解决方案是使用规则的
运行:
部分,而不是
shell:
。这允许您使用python代码:

rule download_sample:
    # ...
    run:
        for input_file in input:
            shell(f"parallel-fastq-dump --sra-id {input_file} --threads {params.threads} --outdir {params.outdir} --gzip")
然而,这种直截了当的解决方案并不惯用。从我所看到的,在输入样本和输出文件之间有一对一的关系。换句话说,要生成一个
out/{sample}\u fastq.gz
文件,您需要一个
{sample}
。最好的解决方案是将规则简化为生成单个文件的规则:

rule download_sample:
    input: "{sample}"
    output: "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {input} --threads {params.threads} --outdir {params.outdir} --gzip "

规则
all:
现在要求所有目标;规则
download\u sample
下载单个样本,Snakemake工作流完成其余工作:它构建依赖关系图,并为每个样本创建规则
download\u sample
的一个实例。此外,如果您希望它可以并行运行这些规则。

在我看来,您需要的是使用
通配符
对象访问
示例
通配符:

rule all:
    input: expand("out/{sample}_fastq.gz", sample=samples)

rule download_sample:
    output: 
        "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell:"parallel-fastq-dump --sra-id {wildcards.sample} --threads {params.threads} --outdir {params.outdir}  --gzip "

非常感谢你。你的解决方案有道理,但我有个错误<代码>输入文件中的通配符无法从输出文件中确定:'sample'另外,为了澄清,如果我的输入文件
Samples.txt
中有
sample\u a
sample\u b
这两行,那么{input\u file}中的每一行都是shell中用于澄清的单独命令,然后将有两个不同的shell命令:
parallel fastq dump--sra id sample_a…..
parallel fastq dump--sra id sample_b…..
我为您提供了两个解决方案,哪一个会产生错误?请更新您的问题。解决方案2会产生错误(我需要类似于解决方案2的东西,因为我打算并行运行它)。我在这个SO问题中也看到了类似的问题,但似乎没有得到回答:@user10101904,请给出产生错误的代码的完整示例。我已经用代码和错误更新了我的原始问题。感谢您的帮助,规则的
输入
部分必须引用文件(或在用相应值替换通配符后可以引用文件的模式)。Snakemake需要它,因为它根据规则所需的文件(
input
section)和生成的文件(
output
section)连接规则。SRA id不能属于
输入
部分,因为它不是文件。它可能在参数部分,但这里似乎不需要它,因为SRA id只对应于
{sample}
通配符,您可以在
shell
部分直接使用它(请参见@dariober的答案)。谢谢@dariober-您的解决方案成功了
rule download_sample:
    input: "{sample}"
    output: "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {input} --threads {params.threads} --outdir {params.outdir} --gzip "
rule all:
    input: expand("out/{sample}_fastq.gz", sample=samples)

rule download_sample:
    output: 
        "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell:"parallel-fastq-dump --sra-id {wildcards.sample} --threads {params.threads} --outdir {params.outdir}  --gzip "