从非Snakefile目录运行Snakefile的报错问题求助
解决从主脚本运行子目录Snakefile的问题
你遇到的问题源于调用Snakemake的方式不正确,以下是具体解决方法:
问题根源
- 执行
snakemake runs/run1/Snakefile -j5时,Snakemake会把路径当成规则名称而非Snakefile的指定路径,因此无法识别到目标文件。 - 执行
snakemake runs/run1/ -j5时,Snakemake不会自动扫描目录下的Snakefile,必须明确指定工作目录或文件路径。 - 使用
os.chdir后仍找不到文件,大概率是路径用了相对路径导致切换失败,或是os.system中的命令未加引号格式错误。
正确实现方式
方式1:指定Snakefile路径与工作目录
用-s参数明确指定Snakefile路径,同时用--directory(缩写-d)指定工作目录,确保Snakemake能读取该目录下的所有依赖文件:
import os os.system("snakemake -s runs/run1/Snakefile --directory runs/run1 -j5")
方式2:切换到目标目录后执行
先切换到run1目录(建议用绝对路径避免相对路径问题),再执行Snakemake命令:
import os # 获取run1目录的绝对路径 run_dir = os.path.abspath("runs/run1") os.chdir(run_dir) # 命令需加引号包裹 os.system("snakemake -j5")
方式3:使用subprocess模块(推荐)
os.system功能有限,subprocess模块能更好地处理命令执行和错误捕获:
import os import subprocess run_dir = os.path.abspath("runs/run1") # 通过cwd参数指定工作目录,无需手动切换 subprocess.run( ["snakemake", "-j5"], cwd=run_dir, check=True, # 命令执行失败时抛出异常 text=True # 以文本格式输出日志 )
内容的提问来源于stack exchange,提问作者Sam H
相关产品推荐
相关产品推荐

