CWL basecommand でサブコマンドがあるツールで起こりがちなこと。--validateが通っているのにエラー

CWL basecommand でサブコマンドがあるツールで起こりがちなこと。–validateが通っているのにエラー

この記事は、Common Workflow Language (CWL) Advent Calendar 2020 - Adventar の3日目と、 Common Workflow Language (CWL) Advent Calendar 2019 - Qiita の11日目の記事になります。

bamtools sort とか、 picard BamIndexStats

などを、CWLで作ったときに、

cwltool --validate でチェックしてもエラーがない。

が、実行するとエラーがでるときがある。

結論から先に書くこと basecommand の中でダブルクォートで、サブコマンドまでを1つでくくっていないかを確認する。

basecommand: ["bamtools sort"]

とか

basecommand: ["picard BamIndexStats`"]

のようになっていないかを確認する。

意図通りに動作させるには

basecommand: ["bamtools", "sort"]

とか

basecommand: ["picard", "BamIndexStats`"]

のように、ダブルクォートで括る部分に空白を含まないようにするということである。

例 echo hello world

エラーになる例

#!/usr/bin/env cwl-runner
class: CommandLineTool
cwlVersion: v1.0
baseCommand: ["echo hello"]
inputs: []
outputs:
  - id: out
    type: stdout
stdout: hello.txt

これで cwltool --validate 実行する

$ cwltool --validate echo_hello_valid_but_error.cwl
(省略)
echo_hello_valid_but_error.cwl is valid CWL.

実行する

$ cwltool echo_hello_valid_but_error.cwl
(省略)
ERROR 'echo hello' not found: [Errno 2] No such file or directory: 'echo hello'
WARNING [job echo_hello_valid_but_error.cwl] completed permanentFail
{}
WARNING Final process status is permanentFail
$ echo $?
1
$ cat hello.txt
cat: hello.txt: No such file or directory

エラーにならない例

#!/usr/bin/env cwl-runner
class: CommandLineTool
cwlVersion: v1.0
baseCommand: [echo, hello]
inputs: []
outputs:
  - id: out
    type: stdout
stdout: hello.txt

これで cwltool --validate 実行する

$ cwltool --validate echo_hello.cwl
(省略)
echo_hello.cwl is valid CWL.

実行する

$ cwltool echo_hello.cwl
(省略)
INFO Final process status is success
$ echo $?
0
$ cat hello.txt
hello
Written on December 2, 2020