从管道stdout读取无限等待

时间:2014-03-13 16:17:46

标签: python matlab pipe stdout

我有python脚本,使用subprocess.Popen向matlab脚本发送命令。反过来,Matlab使用管道的stdout将数据发送回python。 Python和Matlab之间的通信应无限运行,但是,一旦从Matlab检索到信息,python应该运行自己的函数。问题是python从Matlab无限地等待信息。代码将明确说明:

class MatlabWrapper(object):
def __init__(self, barrier_fullname=DEFAULT_BARRIER_FULLNAME):
    self.barrier_fullname = barrier_fullname

def run(self):
    self.process = subprocess.Popen(
        'matlab -nodisplay -nosplash', shell=True, 
        stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=DEVNULL)

    #self.process.stdin.write('matlabpool 8;\n')
    self.process.stdin.flush()

def execute(self, cmd):
    try:
        os.remove(self.barrier_fullname)
    except OSError:
        pass

    self.process.stdin.write(cmd)
    self.process.stdin.write('; !touch %s\n' % self.barrier_fullname)
    self.process.stdin.flush()

    while True:
        try:
            with open(self.barrier_fullname, 'rb') as _:
                break
        except IOError:
            time.sleep(0)

    os.remove(self.barrier_fullname)
while True:
    line = self.process.stdout.readline()
    if line:
        print '>>>' + line.rstrip()
    else:
        break

创建MatlabWrapper实例后,启动初始化管道的run函数。然后我发送命令执行到Matlab,并等待它输出一些信息(使用printf)。逐行读取stdout后,它将停在第line = self.process.stdout.readline()行并等待来自matlab的更多信息。

我想要的是,当stdout中没有信息时,python将完成execute功能。我该怎么做?

0 个答案:

没有答案