为什么python不再等待os.system完成?

时间:2012-12-27 18:40:24

标签: python os.system

我有以下功能,几个月来一直很好用。我没有更新我的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输出。一切似乎都很好。

3 个答案:

答案 0 :(得分:7)

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.

答案 1 :(得分:5)

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

import subprocess as subp
subp.check_call(str(cline), shell=True)

答案 2 :(得分:0)

这个答案有点晚了。但是,我遇到了同样的问题,子流程似乎无法正常工作。 我通过将命令写入bash文件并通过python os.system执行bash文件来解决该问题:

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

(使用Python脚本)

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

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