Python 如何处理snakemake中配置文件中提供的ftp链接?

Python 如何处理snakemake中配置文件中提供的ftp链接?,python,ftp,config,snakemake,Python,Ftp,Config,Snakemake,我正在尝试构建snakemake工作流,该工作流将提供指向本地文件的符号链接(如果该文件存在),或者如果该文件不存在,则将下载该文件并将其集成到工作流中。为此,我使用了两个具有相同输出的规则,并使用ruleorder优先使用链接规则(下面的ln_fastq_pe) 在执行工作流之前,文件是否存在是已知的。文件路径或ftp链接在选项卡分隔的配置文件中提供,工作流使用该文件读取样本。 e、 g.samples.txt的内容: id sample_name fq1 fq2 b

我正在尝试构建snakemake工作流,该工作流将提供指向本地文件的符号链接(如果该文件存在),或者如果该文件不存在,则将下载该文件并将其集成到工作流中。为此,我使用了两个具有相同输出的规则,并使用ruleorder优先使用链接规则(下面的ln_fastq_pe)

在执行工作流之前,文件是否存在是已知的。文件路径或ftp链接在选项卡分隔的配置文件中提供,工作流使用该文件读取样本。 e、 g.samples.txt的内容:

id      sample_name     fq1     fq2
b       test_paired     resources/SRR1945436_1.fastq.gz resources/SRR1945436_2.fastq.gz
c       test_paired2    ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR194/005/SRR1945435/SRR1945435_1.fastq.gz  ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR194/005/SRR1945435/SRR1945435_2.fastq.gz
此处工作流中的相关代码:

import pandas as pd
from snakemake.remote.FTP import RemoteProvider as FTPRemoteProvider
FTP = FTPRemoteProvider()

configfile: "config/config.yaml"
samples = pd.read_table("config/samples.tsv").set_index("id", drop=False)
all_ids=list(samples["id"])

ruleorder: ln_fastq_pe > dl_fastq_pe
rule dl_fastq_pe:
    """
    download file from ftp link
    """
    input:
        fq1=lambda wildcards: FTP.remote(samples.loc[wildcards.id, "fq1"], keep_local=True),
        fq2=lambda wildcards: FTP.remote(samples.loc[wildcards.id, "fq2"], keep_local=True)
    output:
        "resources/fq/{id}_1.fq.gz",
        "resources/fq/{id}_2.fq.gz"
    shell:
        """
        mv {input.fq1} {output[0]}
        mv {input.fq2} {output[1]}
        """

rule ln_fastq_pe:
    """
    link file
    """
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"],
        fq2=lambda wildcards: samples.loc[wildcards.id, "fq2"]
    output:
        "resources/fq/{id}_1.fq.gz",
        "resources/fq/{id}_2.fq.gz"
    shell:
        """
        ln -sr {input.fq1} {output[0]}
        ln -sr {input.fq2} {output[1]}
        """
运行此工作流时,我收到以下错误,指向描述ln\u fastq\u pe规则的行

WorkflowError in line 58 of /path/to/Snakefile:
Function did not return str or list of str.

我认为错误在于我如何在dl_fastq_pe规则中描述samples.txt配置文件中的FTP链接。什么是描述表格配置文件中给出的FTP链接的正确方式,以便snakemake能够理解这些链接并在工作流中下载和使用这些文件


还有,有可能做到我想做的事情吗?这个方法能让我做到吗?我尝试过其他解决方案(例如,使用python代码检查文件是否存在,如果存在,则执行一组shell命令,如果不存在,则执行另一组shell命令),但都无济于事。

您试图将对象从
pandas
传递到Snakemake。后者需要规则输入部分中类型
str
list[str]
的值,但您提供的值(
samples.loc[wildcards.id,“fq1”]
)的类型为
pandas.core.frame.DataFrame
pandas.core.series
。您需要将它们转换为Snamemake所期望的。例如,这可能会有所帮助:
samples.loc[wildcards.id,“fq1”].tolist()

我通过省略输入,而是通过参数读取samples.tsv中的字段,并将两个规则合并为一个规则,从而找到了实现方法。Snakemake对通过参数读取的内容并不挑剔,这与输入不同。然后我使用
test
命令询问文件是否存在。如果存在符号链接,请继续使用符号链接;如果没有符号链接,请使用wget下载

解决办法如下:

import os
import pandas as pd

samples = pd.read_table("config/samples.tsv").set_index("id", drop=False)
all_ids=list(samples["id"])

rule all:
    input:
        expand("resources/fq/{id}_1.fq.gz", id=all_ids),
        expand("resources/fq/{id}_2.fq.gz", id=all_ids)

rule dl_fastq_pe:
    """
    if file exists, symlink. If file doesn't exist, download to resources
    """
    params:
        fq1=lambda wildcards: samples.loc[wildcards.id,"fq1"],
        fq2=lambda wildcards: samples.loc[wildcards.id,"fq2"]
    output:
        "resources/fq/{id}_1.fq.gz",
        "resources/fq/{id}_2.fq.gz"
    shell:
        """
        if test -f {params.fq1}
        then
            ln -sr {params.fq1} {output[0]}
            ln -sr {params.fq2} {output[1]}
        else
            wget --no-check-certificate -O {output[0]} {params.fq1}
            wget --no-check-certificate -O {output[1]} {params.fq2}
        fi
        """

您的目标是将samples.tsv中描述的FTP链接作为
str
提供给
FTP.remote()
函数进行下载,这是正确的。我尝试了你的解决方案,但没有完全达到目的。也许可以定义一个外部函数来生成字符串并返回
FTP.remote(str)
,然后使用该函数作为dl\u fastq\u pe规则的输入?你比我更了解你的任务。只需关注您提供给规则的对象的类型。