python subprocess.call()在将参数传递给shell脚本之前修改参数?

python subprocess.call()在将参数传递给shell脚本之前修改参数?,python,bash,shell,subprocess,amos,Python,Bash,Shell,Subprocess,Amos,我正在编写一个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”)和输出参数(

我正在编写一个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”)

-最小值2:根据引用重叠合并序列数据集,需要一个参数“-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
作为一种解决方法,但互联网上充斥着明确建议不要这样做的说明

这里有什么问题吗? 我能做什么?

回答 或者:

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"])
call(["minimus2", output_basename, "-D REFCOUNT=400", "-D OVERLAP=500"])
你应提供:

  • “-s”+输入文件
    (在
    -s
    之后没有空格),
    “-o”+输出_basename+”.afg”
  • “-s”、inputfile
    (单独参数)、
    “-o”、output\u basename+“.afg”
在您的情况下:

call(["toAmos", "-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
选项;在这种情况下,我建议您始终提供参数列表。

-s
和以下输入文件名应该是调用的独立参数,因为它们在命令行中:

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

第一个选项对我来说也不起作用(见上文末尾的“无此类文件”错误)。但是第二个选择是一个很大的帮助。我没有意识到您必须分别传递参数标志和各自的参数。谢谢,好的。抱歉,刚刚意识到您传递的字符串不是列表。不知何故,我从示例中收集到,subprocess.call()只接受列表,没有参数的简单命令必须作为只包含一项的列表调用。谢谢你的澄清。啊,好的。我必须分别传递所有标志和各自的参数字符串!我想我必须把每面旗帜和它各自的论点一起通过。我真傻。谢谢如果不在选项字母后添加空格,则调用可以传递每个标志及其各自的参数。选项解析库通常需要一个命令行参数
“-oOPTION\u参数”
或两个命令行参数
“-o”,“Option\u参数”
。这是shell在命令调用时提供的,您也应该提供。在选项字母和选项参数之间添加空格就像在shell中键入
'grep'-F'-e your_pattern'
;这不是预期的,也不会起作用。