【问题标题】:tempfile is not accessible when using subprocess.Popen使用 subprocess.Popen 时无法访问临时文件
【发布时间】:2015-04-03 07:05:17
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    f = tempfile.NamedTemporaryFile() 返回一个类似文件的对象,您尝试将其作为命令行参数提供。相反,您想要 actual filename 可以通过其 .name 属性获得 - 尽管我有些困惑为什么要创建临时文件,写入它,返回位置 0,然后替换你的 tempfile f 对象与文件的内容?我怀疑您不想进行替换并使用f.name 进行查询。

    Result = subprocess.Popen(['blastn','-remote','-db','chromosome','-query',f.name,'-out',str(i)],stdout=subprocess.PIPE)
    

    此外,subprocess.Popen 周围还有一些方便的包装函数,例如 subprocess.check_output,它们对于您的意图也更加明确,可以在此处使用。

    【讨论】:

    • 你是对的!我不知道我在做什么。无论如何, f.name 技巧确实有效!谢谢!
    • @shuoyangli 如果您觉得我的回答解决了您的问题-请随时Accept my Answer
    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2020-09-23
    • 2017-09-11
    • 2015-01-03
    相关资源
    最近更新 更多