如何在 snakemake 包装器中访问 snakefile 中定义的变量



我想写一个 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:
    # ...

最新更新