Snakemake通配符:使用目录输出中的通配符文件



我是新来的Snakemake和尝试使用特定的文件在一个规则,从directory()的另一个规则的输出克隆一个git仓库。

目前,这给了我一个错误Wildcards in input files cannot be determined from output files: 'json_file',我不明白为什么。我以前在https://carpentries-incubator.github.io/workflows-snakemake/index.html上学习过教程。

我的工作流和教程工作流之间的区别在于,我想要创建我在第一步稍后使用的数据,而在教程中,数据已经存在了。

工作流程描述:

  1. 克隆git仓库到路径{path}
  2. 对目录{path}/parsed/中的每个JSON文件并行运行一个脚本{script},生成聚合结果{result}
GIT_PATH = config['git_local_path']  # git/
PARSED_JSON_PATH = f'{GIT_PATH}parsed/'
GIT_URL = config['git_url']
# A single parsed JSON file
PARSED_JSON_FILE = f'{PARSED_JSON_PATH}{{json_file}}.json'
# Build a list of parsed JSON file names
PARSED_JSON_FILE_NAMES = glob_wildcards(PARSED_JSON_FILE).json_file
# All parsed JSON files
ALL_PARSED_JSONS = expand(PARSED_JSON_FILE, json_file=PARSED_JSON_FILE_NAMES)

rule all:
input: 'result.json'
rule clone_git:
output: directory(GIT_PATH)
threads: 1
conda: f'{ENVS_DIR}git.yml'
shell: f'git clone --depth 1 {GIT_URL} {{output}}'
rule extract_json:
input:
cmd='scripts/extract_json.py',
json_file=PARSED_JSON_FILE
output: 'result.json'
threads: 50
shell: 'python {input.cmd} {input.json_file} {output}'

只运行clone_git工作正常(如果我设置allinputGIT_PATH)。

为什么我得到错误信息?这是因为工作流启动时JSON文件不存在吗?

还有-我不知道这是否重要-这是module使用的子工作流。

您需要的似乎是首先执行的checkpoint规则,然后snakemake确定哪些.json文件存在并运行您的提取/聚合函数。下面是一个改编的例子:

我很难完全理解你克隆git repo后得到的文件和文件夹结构。所以我回到了Snakemake使用resources下载和results创建文件的最佳实践。

你需要重新调整这些路径来匹配你的情况:

GIT_PATH = config["git_local_path"]  # git/
GIT_URL = config["git_url"]
checkpoint clone_git:
output:
git=directory(GIT_PATH),
threads: 1
conda:
f"{ENVS_DIR}git.yml"
shell:
f"git clone --depth 1 {GIT_URL} {{output.git}}"

rule extract_json:
input:
cmd="scripts/extract_json.py",
json_file="resources/{file_name}.json",
output:
"results/parsed_files/{file_name}.json",
shell:
"python {input.cmd} {input.json_file} {output}"

def get_all_json_file_names(wildcards):
git_dir = checkpoints.clone_git.get(**wildcards).output["git"]
file_names = glob_wildcards(
"resources/{file_name}.json"
).file_name

return expand(
"results/parsed_files/{file_name}.json",
file_name=file_names,
)
# Rule has checkpoint dependency: Only after the checkpoint is executed
# the rule is executed which then evaluates the function to determine all
# json files downloaded from the git repo
rule aggregate:
input:
get_all_json_file_names
output:
"result.json",
default_target: True
shell:
# TODO: Action which combines all JSON files

edit:将expand(...)rule aggregate移到get_all_json_file_names

相关内容

  • 没有找到相关文章

最新更新