4

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

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

4

4 回答 4

3

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

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

安德烈亚斯

于 2016-12-05T08:20:05.670 回答
3

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

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}
        """

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

于 2016-12-06T15:06:55.500 回答
2

在蛇形文档中:

“蛇文件中的所有路径都相对于执行蛇的目录进行解释。可以通过在蛇文件中指定工作目录来覆盖此行为:”

workdir: "path/to/workdir"

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

于 2016-12-06T14:31:23.930 回答
1

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

请参阅此处的文档

于 2016-12-03T19:56:35.553 回答