我想写一个 snakemake 包装器,能够根据主 snakefile 中定义的变量值来调整其行为。
这似乎不是简单地工作,当我尝试在包装器中使用这样的变量时,我会得到一个NameError
。
特别是,我希望包装器在集群上运行时在 shell 命令周围添加module load ...
和module unload ...
命令,该集群使用这种机制将一些程序放入PATH
中,基于配置文件中定义的信息:
在主蛇文件中:
load_modules = False
# By default, cluster nodes are expected
# to have names starting with "tars"
cluster_prefix = config.get("cluster_prefix", "tars")
if cluster_prefix:
from socket import gethostname
if gethostname().startswith(cluster_prefix):
load_modules = True
# ...
rule ...:
# ...
wrapper:
"file://path/to/the/wrapper/folder"
然后,在相应的wrapper.py
文件中:
if load_modules:
# ...
这导致:
NameError: name 'load_modules' is not defined
是否可以让包装器知道一些变量,而无需通过规则中额外的params
部分?
一种不需要向规则的params
部分添加东西的可能性是将变量存储在config
中,可以在 snakemake 包装器中作为snakemake.config
访问。
例如,在蛇文件中:
# By default, cluster nodes are expected
# to have names starting with "tars"
cluster_prefix = config.get("cluster_prefix", "tars")
if cluster_prefix:
from socket import gethostname
if gethostname().startswith(cluster_prefix):
config["load_modules"] = True
# ...
rule ...:
# ...
wrapper:
"file://path/to/the/wrapper/folder"
在wrapper.py
:
load_modules = snakemake.config.get("load_modules", False)
if load_modules:
# ...