使用 subprocess.Popen 时无法访问临时文件

tempfile is not accessible when using subprocess.Popen

当我运行以下脚本时,出现错误"Command line argument error: Argument "查询“文件不可访问”。我正在使用 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()

f = tempfile.NamedTemporaryFile() returns 您试图作为命令行参数提供的类文件对象。相反,你想要 actual filename 可以通过它的 .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,它们也更明确地说明了您的意图,可以在此处使用。