12

我有以下功能,几个月来一直很好用。我还没有更新我的 Python 版本(除非它发生在幕后?)。

def Blast(type, protein_sequence, start, end, genomic_sequence):
    result = []
    M = re.search('M', protein_sequence)
    if M:
        query = protein_sequence[M.start():]
        temp = open("temp.ORF", "w")
        print >>temp, '>blasting'
        print >>temp, query
        temp.close()
        cline = blastp(query="'temp.ORF'", db="DB.blast.txt",
                       evalue=0.01, outfmt=5, out=type + ".BLAST")
        os.system(str(cline))
        blast_out = open(type + ".BLAST")
        string = str(blast_out.read())
        DEF = re.search("<Hit_def>((E|L)\d)</Hit_def>", string)

我收到blast_out=open(type+".BLAST")找不到指定文件的错误。该文件是作为调用调用的程序输出的一部分创建的os.system。这通常需要 30 秒左右才能完成。但是,当我尝试运行该程序时,它会立即给出我上面提到的错误。

我以为os.system()应该等待完成?
我应该以某种方式强迫等待吗?(我不想硬编码等待时间)。

编辑:我已经在 BLAST 程序的命令行版本中运行了 cline 输出。一切似乎都很好。

4

3 回答 3

10

os.system确实等待。但是它调用的程序可能有错误,所以文件没有被创建。在继续之前,您应该检查被调用程序的返回值。一般来说,程序正常结束时应该返回 0,出现错误时返回另一个值:

if os.system(str(cline)):
    raise RuntimeError('program {} failed!'.format(str(cline)))
blast_out=open(type+".BLAST")

除了引发异常,您还可以从Blast函数返回,或者尝试以其他方式处理它。

更新:被调用的程序是否从命令行运行良好只会告诉您程序本身没有问题。出现问题时,程序是否blast返回有用的错误或消息?如果是这样,请考虑使用subprocess.Popen()而不是os.system,并捕获标准输出:

prog = subprocess.Popen(cline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = prog.communicate()
# Now you can use `prog.returncode`, and inspect the `out` and `err` 
# strings to check for things that went wrong.
于 2012-12-27T18:47:12.313 回答
6

您还可以用 subprocess.check_call 替换对 os.system 的调用,如果命令失败,这将引发异常:

import subprocess as subp
subp.check_call(str(cline), shell=True)
于 2012-12-27T19:01:32.003 回答
0

这个答案有点晚了。但是,我遇到了同样的问题,并且 subprocess 似乎不起作用。我通过将命令写入 bash 文件并通过 python os.system 执行 bash 文件来解决它:

vi forPython.sh (write 'my command' into it)
chmod +x forPython.sh

(在 Python 脚本中)

os.system("./forPython.sh")

这使 python 等待您的进程完成。

于 2018-09-25T15:06:33.877 回答