6

私はsnakemakeワークフロー用のSnakefileを書いています。私のワークフローの一部として、データベース内の一連のレコードが変更されたかどうか、およびそれらが再ダウンロードされたかどうかを確認する必要があります。

私が考えたのは、データベースのタイムスタンプをチェックして出力ファイルに書き込むルールを作成することでした。そして、タイムスタンプ ファイルをダウンロード ルールへの入力として使用します。問題は、タイムスタンプ ファイルが書き込まれると、タイムスタンプ ルールが再度実行されないため、タイムスタンプが更新されないことです。

このルールを毎回実行する方法はありますか。(シェルから強制できることはわかっていますが、Snakefile で指定したいと思います) または、これを処理するためのより良い方法はありますか?

4

2 に答える 2

6

ルールまたは関数定義の外で Snakefile に追加するコードは、起動時に通常の Python スクリプトと同じように実行されるため、外部シェル スクリプトは必要ありません。Python で必要なロジックを Snakefile に直接実装し、必要に応じて shell() 関数を使用できます。

1 つの注意点として、クラスターでワークフローを実行しようとすると、サブミットされたクラスター ジョブごとに毎回コードが実行されます。これを回避するための粗雑ですが効果的な方法は、次のようなチェックでガードすることです。

if '--nolock' not in sys.argv:
    if check_database_for_updates():
        os.utime('touch.file')

次に、データベースから読み取るルールへのプロキシ入力として touch.file を設定します。それは理にかなっていますか?

ティム

于 2016-04-28T10:34:27.803 に答える