在一个有几个步骤的数据处理项目中,使用Snakemake,子目录中有一个Python木星笔记本,它处理一些数据:
笔记本processing_step_1/process.ipynb包含:
with open('input.csv') as infile:
for line in infile:
print(line)数据文件processing_step_1/input.csv包含:
one,two,three
1,2,3这是使用Snakefile的notebook:
rule process_data:
input:
"processing_step_1/input.csv",
notebook:
"processing_step_1/process.ipynb"如果我以交互方式运行笔记本,或者像这样从命令行运行
jupyter nbconvert --execute --to notebook processing_step_1/process.ipynb它起作用了。工作目录被设置为笔记本的目录,输入文件可以用一个相对路径找到。
但是,当从Snakemake运行时,请使用
snakemake -c1我收到一条错误消息
FileNotFoundError: [Errno 2] No such file or directory: 'input.csv'这是因为笔记本是在不同的目录中复制和执行的,从Snakemake错误消息中可以看到:
Command 'set -euo pipefail; jupyter-nbconvert --log-level ERROR --execute --to notebook --ExecutePreprocessor.timeout=-1 /path/to/project/.snakemake/scripts/tmp9mmr8k20.process.ipynb' returned non-zero exit status 1.在使用Snakemake时,从与笔记本相同的目录中加载数据文件的标准方法是什么?
我想仍然能够使用相同的笔记本独立,没有蛇马克。因此,最好我不想添加Snakemake特定的代码到它。
似乎不可能从笔记本中找到包含笔记本的目录。参见例如https://stackoverflow.com/a/52119628/381281。另外,我无法找到在Snakemake中为每个规则设置工作目录的方法。
发布于 2022-06-24 03:38:26
@hfs (OP)解决方案是解决此问题的一种方法,但另一种方法是避免硬编码笔记本中的文件路径:
# with open('input.csv') as infile: <- this is hard-coded
with open(snakemake.input[0]) as infile: # this is flexible
...请注意,要使该解决方案工作,应该使用notebook指令而不是shell-nbconvert组合。
发布于 2022-06-23 15:55:31
使用shell,可以将cd转到所需的工作目录:
rule process_data:
input:
"processing_step_1/input.csv",
shell:
"""
cd processing_step_1
jupyter nbconvert --execute --to notebook --inplace process.ipynb
"""https://stackoverflow.com/questions/72733187
复制相似问题