Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从管道stdout读取数据将无限等待_Python_Matlab_Pipe_Stdout - Fatal编程技术网

Python 从管道stdout读取数据将无限等待

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

我有一个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
)。逐行读取标准输出后,它会在line
line=self.process.stdout.readline()
处停止,并等待来自matlab的更多信息


我想要的是,当标准输出中没有信息时,python将完成
execute
函数。我该怎么做?

你要关上管道吗?当管道在另一端关闭时,您只会得到一个
EOF
(这将使
readline
返回一个空字符串)。我应该在哪里关闭管道?我的意思是Matlab如何关闭管道?此外,正如我所描述的,我需要通信无限地运行(原因是在matlab中设置环境花费了太多时间)。因此,在这里关闭管道可能不是一个解决方案。接下来要做的另一件事是以某种方式让MATLAB输出一些自定义的“工作完成”标志行,并在python中进行检查。