我是新来的Snakemake和尝试使用特定的文件在一个规则,从directory()
的另一个规则的输出克隆一个git仓库。
目前,这给了我一个错误Wildcards in input files cannot be determined from output files: 'json_file'
,我不明白为什么。我以前在https://carpentries-incubator.github.io/workflows-snakemake/index.html上学习过教程。
我的工作流和教程工作流之间的区别在于,我想要创建我在第一步稍后使用的数据,而在教程中,数据已经存在了。
工作流程描述:
- 克隆git仓库到路径{path}
- 对目录{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
工作正常(如果我设置all
input
的GIT_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
。