4

私が使用したスクリプトはすべて、スクリプトが呼び出された現在のディレクトリに出力ファイルを配置するため、シェル スクリプト パイプラインでは、コマンドを実行するために特定のディレクトリに移動する cd コマンドがあり、出力ファイルは関連するディレクトリに保存されます。私のスクリプトには出力ディレクトリのパラメーターがなく、ほとんどのスクリプトは入力から推測される出力ファイル名を取得します。それは私にとってかなりうまくいきました。

今、snakemake がファイルを Snakefile があるディレクトリに出力しているように見えるため、この出力ディレクトリの問題に一貫して遭遇しています。すべてのスクリプトを変更して、出力ディレクトリの追加パラメーターを取得することもできますが、多くのスクリプトを変更するのは面倒です。特定のルールごとに出力先を指定する方法があるかどうか疑問に思っていますか?

4

4 に答える 4

3

これは、私のスネークファイルの 1 つで使用するルールの例です。

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セクションの内容と一貫した方法で出力も行います)。あなたの場合、おそらくルールの入力の一部を使用して、単に「ハードコードされた」シェルコマンドを使用する可能性があります。

より合理化された例

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

スネークメイクのドキュメント:

「snakefile 内のすべてのパスは、snakemake が実行されているディレクトリに対して相対的に解釈されます。この動作は、snakefile で workdir を指定することによってオーバーライドできます。」

workdir: "path/to/workdir"

したがって、それをスネークファイルの先頭に置くだけで、すべての入力と出力がこのパスに関連して解釈されます。

于 2016-12-06T14:31:23.930 に答える