使用subprocess.Popen时无法访问tempfile

时间:2015-04-03 07:05:17

标签: python python-3.x subprocess temporary-files

当我运行以下脚本时,错误"命令行参数错误:参数"查询"。文件无法访问"发生。我正在使用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()

1 个答案:

答案 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,这些函数在某些情况下也更加明确,可以在此处使用。