【问题标题】:snakemake: is there a way to specify an output directory for each rule?snakemake:有没有办法为每个规则指定一个输出目录?
【发布时间】:2016-12-02 21:40:19
【问题描述】:

我使用的所有脚本都将输出文件放在调用脚本的当前目录中,因此在我的 shell 脚本管道中,我将使用 cd 命令转到特定目录以运行命令,并且输出文件将仅保存在相关目录中目录。我的脚本没有输出目录的参数,并且大多数脚本都从输入中推断出输出文件名。这对我来说效果很好。

现在我一直遇到这个输出目录问题,因为 snakemake 似乎将文件输出到 Snakefile 所在的目录。我可以修改所有脚本以获取输出目录的附加参数,但这对于修改许多脚本来说已经很痛苦了。我想知道是否有任何方法可以指定每个特定规则的输出位置?

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    一个技巧是首先 cd 进入输出目录,即“cd $(dirname {output[0]})”。这必须是您的 shell 命令中的第一个。

    话虽如此,最好将脚本更改为接受输出目录作为参数。

    安德烈亚斯

    【讨论】:

    • 无法让它以某种方式轻松工作,我想我将不得不修改我的脚本..
    【解决方案2】:

    这是我在我的一个蛇文件中使用的示例规则:

    rule link_raw_data:
        output:
            OPJ(data_dir, "{lib}_{rep}.fastq.gz"),
        params:
            directory = data_dir,
            shell_command = lib2data,
        message:
            "Making link to raw data {output}."
        shell:
            """
            (
            cd {params.directory}
            {params.shell_command}
            )
            """
    

    这可能与您的情况有些不同,但希望其中一些技巧可以提供帮助。特别要注意shell 部分中的括号以及params 部分用于定义输出目录的用法。

    我不确定我是否以最优雅的方式执行此操作,但它确实有效。

    data_dir 是从配置文件中读取的参数。

    lib2data 是一个根据某些通配符的值生成命令的函数。当然,我必须确保这些命令使用正确的输入文件路径(在这种情况下,输出也必须与output 部分所说的一致)。在你的情况下,你可能只是有一个“硬编码”的 shell 命令,可能会使用一些规则的输入。

    更精简的示例

    rule run_script1:
        input:
            path/to/initial/input
        output:
            script1_out/output1
        shell:
            """"
            cd script1_out
            script1 {input}
            """"
    
    rule run_script2:
        input:
            script1/output1
        output:
            script2/output2
        shell:
            """
            cd script2_out
            script2 {input}
            """
    

    从这些示例开始,如有必要,您可以在输入或输出中使用通配符的功能。

    【讨论】:

    • 谢谢,我想知道shell部分的括号是什么意思?
    • 实际上,我意识到在这种情况下,括号是无用的,因为它们后面没有其他命令。右括号之后的命令将发生在工作目录中,就像在 cd 之前一样。
    • 你的意思是括号将里面的命令组合成一个块,它们将一起执行,因此在 params.directory 中?在括号之外,其他命令在工作目录中有效吗?
    • 是的,这就是它们的用处,但我的示例与这方面无关。
    【解决方案3】:

    在蛇形文档中:

    "snakefile 中的所有路径都是相对于执行snakemake 的目录进行解释的。可以通过在snakefile 中指定工作目录来覆盖此行为:"

    workdir: "path/to/workdir"
    

    所以只需将它放在蛇文件的开头,所有输入和输出都将相对于该路径进行解释。

    【讨论】:

    • 对,我明白这一点,但这并不能解决我要问的问题......
    【解决方案4】:

    您可以尝试使用 YAML 或 JSON 格式的配置文件。然后在扩展或规则的输入/输出中使用该目录作为参数。

    查看文档here

    【讨论】:

    • 我认为这行不通,因为我仍然需要将参数传递到脚本中,而我的脚本还没有采用该参数
    • 您可以使用shell部分中的参数,如我的回答:stackoverflow.com/a/40998525/1878788
    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2020-08-03
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多