Python 从管道stdout读取数据将无限等待
我有一个python脚本,它使用Python 从管道stdout读取数据将无限等待,python,matlab,pipe,stdout,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_B
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
)。逐行读取标准输出后,它会在lineline=self.process.stdout.readline()
处停止,并等待来自matlab的更多信息
我想要的是,当标准输出中没有信息时,python将完成
execute
函数。我该怎么做?你要关上管道吗?当管道在另一端关闭时,您只会得到一个EOF
(这将使readline
返回一个空字符串)。我应该在哪里关闭管道?我的意思是Matlab如何关闭管道?此外,正如我所描述的,我需要通信无限地运行(原因是在matlab中设置环境花费了太多时间)。因此,在这里关闭管道可能不是一个解决方案。接下来要做的另一件事是以某种方式让MATLAB输出一些自定义的“工作完成”标志行,并在python中进行检查。