Snakemake 仅将输出中的第一个路径传递给 shell 命令
Snakemake passes only the first path in the output to shell command
我正在尝试将所有路径一次性提供给 snakemake
中的 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: '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}"
当我访问 python
脚本中的 output
参数时,它只看到第一个路径:'results/neo4j/{sample}/cells.csv'
。我也试过命名每条路径,但没有解决问题。如何将规则 output
中的所有路径作为数组或字典传递,以便稍后在 python
?
中访问它们
rule hello:
output:
"woot", "hoot"
run:
for f in output:
print(f)
print(output[1])
打印 "woot"、"hoot"、"hoot"。
如果我对您的问题的理解正确,您的问题是 neo4j.py
脚本的 -output
参数不接受超过一个文件: shell 命令可能以完整的文件列表(检查 snakemake
的 -p
选项),但脚本只考虑第一个文件。
如果情况确实如此,一种可能更简洁的方法是修改 neo4j.py
脚本的界面,以便它为每个输出文件使用一个参数。
然后您可以按如下方式修改您的规则:
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}
"""
一些可能有用的 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:
'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} \
--out_dir results/neo4j/{wildcards.sample}
"""
我正在尝试将所有路径一次性提供给 snakemake
中的 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: '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}"
当我访问 python
脚本中的 output
参数时,它只看到第一个路径:'results/neo4j/{sample}/cells.csv'
。我也试过命名每条路径,但没有解决问题。如何将规则 output
中的所有路径作为数组或字典传递,以便稍后在 python
?
rule hello:
output:
"woot", "hoot"
run:
for f in output:
print(f)
print(output[1])
打印 "woot"、"hoot"、"hoot"。
如果我对您的问题的理解正确,您的问题是 neo4j.py
脚本的 -output
参数不接受超过一个文件: shell 命令可能以完整的文件列表(检查 snakemake
的 -p
选项),但脚本只考虑第一个文件。
如果情况确实如此,一种可能更简洁的方法是修改 neo4j.py
脚本的界面,以便它为每个输出文件使用一个参数。
然后您可以按如下方式修改您的规则:
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}
"""
一些可能有用的 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:
'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} \
--out_dir results/neo4j/{wildcards.sample}
"""