1

我正在编写一个 python 包装器,用于调用 AMOS 包的程序(特别是用于使用来自 AMOS 的好的 ol' minimus2 合并来自不同来源的基因组程序集)。

直接使用 shell 时,应该像这样调用脚本:

toAmos -s myinput.fasta -o testoutput.afg
minimus2 testoutput -D REFCOUNT=400 -D OVERLAP=500

[只是为了澄清:

-toAmos:将我的 input.fasta 文件转换为 .afg 格式,并且需要一个输入序列参数(“-s”)和一个输出参数(“-o”)

-minimus2:将序列数据集与参考重叠群合并,需要一个参数“-D REFCOUNT=x”来说明输入中的参考序列的数量,以及一个参数“-D OVERLAP=Y”来说明序列之间的最小重叠]

所以在我的脚本中,我使用 subprocess.call() 来调用必要的 AMOS 工具。

基本上我这样做:

from subprocess import call:
output_basename = "testoutput"
inputfile = "myinput.fasta"

call(["toAmos", "-s " + inputfile, "-o " + output_basename + ".afg"])
call(["minimus2", output_basename, "-D REFCOUNT=400", "-D OVERLAP=500"])

但在这种情况下,AMOS 工具无法再解释这些参数。参数似乎被 subprocess.call() 修改并错误传递。我得到的错误信息是:

Unknown option: s myinput.fasta
Unknown option: o testoutput.afg
You must specify an output AMOS AFG file with option -o
/home/jov14/tools/miniconda2/bin/runAmos: unrecognized option '-D REFCOUNT=400'
Command line parsing failed, use -h option for usage info

似乎参数在没有前导“-”的情况下通过了?所以我然后尝试将命令作为单个字符串(包括参数)传递,如下所示:

call(["toAmos -s " + inputfile +" -o " + output_basename + ".afg"])

但后来我得到这个错误......

OSError: [Errno 2] No such file or directory

...大概是因为 subprocess.call 将整个字符串解释为单个脚本的名称。我想我可能会尝试shell=True作为一种解决方法,但互联网上充满了明确建议不要这样做的说明。

这里似乎有什么问题?我能做些什么?

4

2 回答 2

2

回答

要么做:

call("toAmos -s " + inputfile +" -o " + output_basename + ".afg") # single string

或者做:

call(["toAmos", "-s", inputfile, "-o", output_basename + ".afg"]) # list of arguments

讨论

在您的情况下:

call(["toAmos", "-s " + inputfile, "-o " + output_basename + ".afg"])

你应该提供:

  • 要么"-s" + inputfile(之后没有空格-s),"-o" + output_basename + ".afg"
  • "-s", inputfile(单独的参数),"-o", output_basename + ".afg"

在您的情况下:

call(["minimus2", output_basename, "-D REFCOUNT=400", "-D OVERLAP=500"])

和应分别作为两个项目提供 ( "-D REFCOUNT=400") ,或删除空格 ( )。"-D OVERLAP=500"'-D', 'REFCOUNT=400', '-D', 'OVERLAP=500''-DREFCOUNT=400', '-DOVERLAP=500'

附加信息

您似乎缺乏关于 shell 如何拆分命令行的知识;我建议您始终使用单字符串方法,除非文件名中有空格或者您必须使用该shell=False选项;在这种情况下,我建议您始终提供参数列表。

于 2017-06-07T09:30:47.627 回答
1

-s并且以下输入文件名应该是单独的参数call,因为它们在命令行中:

call(["toAmos", "-s", inputfile, "-o", output_basename + ".afg"])
于 2017-06-07T09:31:04.140 回答