如何访问 Snakefile 中的 Snakemake 参数?

How to access Snakemake parameters inside Snakefile?

我想知道如何访问我的 Snakefile 中的 Snakemake 参数,例如设置的目标规则(由用户指定或第一个定义的规则)。我能够使用 dir() 在环境中找到一些设置,但找不到目标规则。那甚至可以访问吗?

编辑:我想在 运行 开头打印最重要参数的概述,包括用户 ID、配置文件路径、还有目标规则(因为我们的工作流程有多个 endpoints/target 规则,我发现将它记录在某个地方很有用)。

进一步挖掘后,我发现 workflow 对象包含一些有用的信息,但是 first_rule 被设置为 None。我本来希望 属性 被设置为目标规则,但也许我还没有理解它的目的,and/or 不应从 workflow 对象中提取任何信息.

我知道我可以使用 --report 功能获取大量信息 - 我们确实在使用它 - 但希望独立于它。

谢谢!

从更新的问题来看,workflow 似乎很有用。具体来说,一种选择是迭代工作流中的所有规则(参见 ),在迭代过程中提取感兴趣的信息。具体针对目标规则信息,下面的Snakefile上的运行 snakemake -j 1好像输出了需要的信息:

rule all:
    input:
        "a.txt",
        "b.txt",


rule a:
    output:
        "a.txt",
    shell:
        """
        echo "a" > {output}
        """


rule b:
    output:
        "b.txt",
    default_target: True,
    shell:
        """
        echo "b" > {output}
        """

print(workflow.default_target)
# will print b

关于 printing 的一个注意事项,如果您正在进行集群提交或您的规则具有对传入数据敏感的 shell 命令,则将信息记录到文件中可能比将信息记录到文件中更好. 打印到标准输出。至少我有一些 non-obvious 错误的经验,这些错误最终可以追溯到我在 Snakefile 中打印。

更新:这是针对边缘情况的 hack,但如果有人对动态修改 default_target 感兴趣,则可以执行如下操作(这只是伪代码,未经测试) :

# assume that config contains the name of the desired target rule
default_target = config["default_target"]

for n, r in enumerate(workflow.rules):
    if r.name == default_target:
        r.default_target = True