如何使子进程对象将输出保存到临时文件,然后从临时文件中获取值?

时间:2017-03-10 15:01:03

标签: python subprocess temporary-files

我目前在Python代码中使用基于Unix的可执行文件来分析一些DNA序列。运行分析后,此特定可执行文件将输出写入文件,然后由我的代码读取并从中获取相关值。

由于除了产生某些值之外不需要任何文件,因此我决定将其作为临时文件,在从中获取必要信息后将删除该文件。但是,我为实现这一目标而设置代码的努力已经证明是徒劳的。

import subprocess as sb
import tempfile

def calculate_complex_mfe(DNA_seq):
    complex_seq= str(DNA_seq)
    with tempfile.NamedTemporaryFile as mfefile:
        p= sb.Popen(['/Users/john/Documents/Biology/nupack3.0.6/bin/mfe', '-T', '41'], stdin=sb.PIPE, stdout=sb.PIPE, env=my_env)
        strb = (mfefile+'\n'+ complex_seq + '\n').encode('utf-8')
        data = p.communicate(input=strb)
        mfe= float(open(mfefile+'.mfe').readlines()[14])
    return mfe

我应该注意,strb变量的设置与可执行文件运行所需的格式相匹配。同样对于它的价值,我使用的原始代码正确运行在下面。

def calculate_complex_mfe(DNA_seq):
    complex_seq= str(DNA_seq)
    filename= "mfe-file"
    p= sb.Popen(['/Users/john/Documents/Biology/nupack3.0.6/bin/mfe', '-T', '41'], stdin=sb.PIPE, stdout=sb.PIPE, env=my_env)
    strb = (filename+'\n'+ complex_seq + '\n').encode('utf-8')
    data = p.communicate(input=strb)
    mfe= float(open(filename+'.mfe').readlines()[14])
    return mfe

有人能告诉我如何为可执行文件的输出创建一个临时文件,以便从中获取一些值吗?

1 个答案:

答案 0 :(得分:1)

来自文档:

  

NamedTemporaryFile(mode ='w + b',buffering = -1,encoding = None,newline = None,suffix ='',prefix ='tmp',dir = None,delete = True)       创建并返回一个临时文件。

     

返回具有类文件接口的对象;文件的名称       可以作为file.name访问。该文件将被自动删除       当它被关闭时,除非'delete'参数设置为False。

您不需要写入文件句柄,只需要创建临时文件名称,而不是打开临时文件。只需替换:

filename= "mfe-file"

通过

filename = tempfile.mktemp()

在您的第二个代码段中为您生成临时文件名(完整路径)

当你完成它时,不要忘记os.remove(filename)