python - 如何处理snakemake的配置文件中提供的ftp链接?
问题描述
我正在尝试构建一个snakemake工作流程,如果本地文件存在或文件不存在,它将提供指向本地文件的符号链接,它将下载文件并将其集成到工作流程中。为此,我使用两个具有相同输出的规则,并使用 ruleorder 优先考虑链接规则(下面的 ln_fastq_pe)。
在执行工作流之前知道文件是否存在。文件路径或 ftp 链接在制表符分隔的配置文件中提供,工作流使用该配置文件来读取样本。例如 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_fastq_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命令,如果不存在则执行另一组)无济于事。
解决方案
您正在尝试将对象传递pandas
给 Snakemake。后者需要类型的值str
orlist[str]
在规则的输入部分,但您提供的值 ( samples.loc[wildcards.id, "fq1"]
) 是类型pandas.core.frame.DataFrame
or pandas.core.series.Series
。您需要将它们转换为 Snamemake 所期望的。例如,这可能会有所帮助:samples.loc[wildcards.id, "fq1"].tolist()
.
推荐阅读
- javascript - 将结果存储在 Aurelia 的全局变量中
- c++ - 如何将双精度数组中的值“强制转换”为 C++ 中的字符串输出?
- c# - 刚体2d.movePosition 和刚体2d.AddForce 之间的交互是如何工作的?
- java - JVM如何执行JNI
- c - 如何从 Linux 中的用户名中获取 uid?
- firebase - Firebase CI 部署为服务帐号
- node.js - 尽管在项目中安装了 es6,npm run 仍会为 ECMAScript 6 代码抛出错误
- python - 我在使用请求发布到网站时遇到问题
- python - 尝试在游戏中加载-更新-重新保存参数
- kubernetes - 如何在 Kubernetes 中拦截对服务的请求?