当我运行以下脚本时,错误"命令行参数错误:参数"查询"。文件无法访问"发生。我正在使用python 3.4.2。
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
import subprocess
import tempfile
import sys
def main():
# read name file and put all identifications into a list
infile_I = open('OTU_name.txt','r')
name = infile_I.read().split('>')
infile_I.close()
# extract sequence segments to a temporary file one at a time
for i in name:
i = i.replace('\n','')
for j in SeqIO.parse("GemSIM_OTU_ids.fa","fasta"):
if str(i) == str(j.id):
f = tempfile.NamedTemporaryFile()
record = j.seq
f.write(bytes(str(record),'UTF-8'))
f.seek(0)
f = f.read().decode()
Result = subprocess.Popen(['blastn','-remote','-db','chromosome','-query',f,'-out',str(i)],stdout=subprocess.PIPE)
output = Result.communicate()[0]
if __name__== '__main__': main()
答案 0 :(得分:1)
f = tempfile.NamedTemporaryFile()
返回一个类似文件的对象,您尝试将其作为命令行参数提供。相反,你想要实际文件名,它可以通过它的.name
属性获得 - 虽然我有点困惑为什么你要创建一个临时文件,写入它,寻找回到位置0,然后用文件的内容替换你的临时文件f
对象?我怀疑你不想做那个替换,并使用f.name
进行查询。
Result = subprocess.Popen(['blastn','-remote','-db','chromosome','-query',f.name,'-out',str(i)],stdout=subprocess.PIPE)
此外,subprocess.Popen
周围还有一些方便的包装函数,例如subprocess.check_output,这些函数在某些情况下也更加明确,可以在此处使用。