我试图将一个变量中的所有路径一次馈入python
中的snakemake
脚本中,如下所示:
rule neo4j:
input:
script = 'python/neo4j.py',
path_to_cl = 'results/clusters/umap/{sample}_umap_clusters.csv',
path_to_umap = 'results/umap/{sample}_umap.csv',
path_to_mtx = 'data_files/normalized/{sample}.csv'
output: 'results/neo4j/{sample}/cells.csv', 'results/neo4j/{sample}/genes.csv',
'results/neo4j/{sample}/cl_nodes.csv', 'results/neo4j/{sample}/cl_contains.csv',
'results/neo4j/{sample}/cl_isin.csv', 'results/neo4j/{sample}/expr_by.csv',
'results/neo4j/{sample}/expr_ess.csv'
shell:
"python {input.script} -path_to_cl {input.path_to_cl} -path_to_umap {input.path_to_umap} -path_to_mtx {input.path_to_mtx} -output {output}"
当我在output
脚本中访问python
参数时,它只会看到第一个路径:'results/neo4j/{sample}/cells.csv'
。我也尝试命名每条路径,但没有解决问题。如何将规则output
中的所有路径作为数组或字典传递,以便以后可以在python
中访问它们?
答案 0 :(得分:2)
如果我正确理解了您的问题,那么您的问题是neo4j.py
脚本的-output
参数不接受多个文件:shell命令可能以文件的完整列表结尾(请使用-p
的{{1}}选项进行检查,但脚本仅考虑第一个。
如果确实如此,一种可能更清洁的方法是修改您的snakemake
脚本的接口,以使其对每个输出文件使用一个参数。
然后您将修改规则,如下所示:
neo4j.py
一些可能有用的python模块来设置脚本接口:
如果您不想将每个输入文件作为单独的参数传递,则只需传递输出目录,然后让脚本从此单个参数构建输出路径。给定所需的文件名,这似乎是可能的:
rule neo4j:
input:
script = 'python/neo4j.py',
path_to_cl = 'results/clusters/umap/{sample}_umap_clusters.csv',
path_to_umap = 'results/umap/{sample}_umap.csv',
path_to_mtx = 'data_files/normalized/{sample}.csv'
output:
cells = 'results/neo4j/{sample}/cells.csv',
genes = 'results/neo4j/{sample}/genes.csv',
nodes = 'results/neo4j/{sample}/cl_nodes.csv',
contains = 'results/neo4j/{sample}/cl_contains.csv',
isin = 'results/neo4j/{sample}/cl_isin.csv',
by = 'results/neo4j/{sample}/expr_by.csv',
ess = 'results/neo4j/{sample}/expr_ess.csv'
shell:
"""
python {input.script} \\
--path_to_cl {input.path_to_cl} \\
--path_to_umap {input.path_to_umap} \\
--path_to_mtx {input.path_to_mtx} \\
--cells {output.cells} \\
--genes {output.genes} \\
--nodes {output.nodes} \\
--contains {output.contains} \\
--isin {output.isin} \\
--by {output.by} \\
--ess {output.ess}
"""
答案 1 :(得分:1)
rule hello:
output:
"woot", "hoot"
run:
for f in output:
print(f)
print(output[1])
打印“ woot”,“ hoot”,“ hoot”。