如何在Bash脚本中访问Snakemake工作目录变量?
在Bash脚本中获取Snakemake的workflow.basedir路径
Snakemake不会自动将Python侧的workflow.basedir暴露为Bash环境变量,但有两种可靠方式获取该路径:
方法1:从Snakefile主动传递变量(推荐)
这是最稳定的方式,直接在规则中把workflow.basedir通过环境变量或命令行参数传给Bash脚本:
通过环境变量传递
在Snakefile的规则里定义:
rule run_my_script: shell: "export SNK_BASEDIR={workflow.basedir} && ./my_script.sh"
然后在你的Bash脚本my_script.sh中直接使用:
#!/bin/bash echo "Snakemake工作目录:$SNK_BASEDIR"
通过命令行参数传递
在Snakefile中:
rule run_my_script: shell: "./my_script.sh {workflow.basedir}"
在Bash脚本中通过位置参数接收:
#!/bin/bash SNK_BASEDIR="$1" echo "Snakemake工作目录:$SNK_BASEDIR"
方法2:在Bash脚本中推导路径
如果无法修改Snakefile,可以通过Snakemake的运行上下文推导workflow.basedir(即Snakefile所在的目录):
#!/bin/bash # 提取Snakemake进程指定的Snakefile路径 SNAKEFILE=$(ps aux | grep -v grep | grep snakemake | awk '{for(i=1;i<=NF;i++) if ($i ~ /--snakefile|-s/) print $(i+1)}') # 若未指定-s参数,默认用当前目录下的Snakefile if [ -z "$SNAKEFILE" ]; then SNAKEFILE="./Snakefile" fi # 提取Snakefile所在目录,即workflow.basedir SNK_BASEDIR=$(dirname "$(realpath "$SNAKEFILE")") echo "Snakemake工作目录:$SNK_BASEDIR"
注意:这种方式依赖进程查询,若运行多个Snakemake实例可能出现误判,仅推荐在单实例场景使用。
内容的提问来源于stack exchange,提问作者5kobrat
相关产品推荐
相关产品推荐

