Как поймать вывод функции matlab из python

Я запускаю код python, ниже которого вычисляется среднее значение массива:

def matlab_func1(array): p = os.popen('matlab -nodesktop -nosplash -r "mean('+str(array)+');exit"') while 1: line = p.readline() if not line: break print line matlab_func1([1,2,3]) 

Из приведенного ниже сценария matlab можно увидеть выходное возвращение в y. Я хочу поймать этот вывод из python.

 function y = mean(x,dim) ... ... end 

Решение должно быть применимо к другой функции matlab. «Средняя» функция является лишь примером.

Используйте fprintf для записи необходимого текста в stderr . Просто добавьте дополнительный аргумент 2 в начале.

 import subprocess import os def matlab_func1(array): p = subprocess.Popen(['/home/user/Matlab/bin/matlab', '-nodesktop', '-nosplash', '-r "m = mean(' + str(array) + ');fprintf(2, \'%d\\n\',m);exit" >/dev/null'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) while 1: try: out, err = p.communicate() except ValueError: break print 'hello' + err matlab_func1('[1,2,3]') 

Несколько замечаний:

  • Изменена команда Python на subprocess.Popen , что позволяет использовать stderr трубопровод.
  • В команде Matlab используйте fprintf для fprintf необходимой информации в stderr . Это может привести к выходу кода из строк заголовка Matlab.
  • Вернитесь в Python, используйте Popen.communicate() чтобы получить вывод stderr .
  • Исключение ValueError обрабатывает событие выхода Matlab ( p закрыто).

РЕДАКТИРОВАТЬ:

для функции, которая дает несколько выходов

говорят, что функция Матлаба

 function [y, z] = foo(x) y = x+1; z = x*20; end 

Дело в том, что fprintf использует для вывода результата, делая все остальное, как обычно, в Matlab.

Метод 1 – встроенный скрипт

 p = subprocess.Popen(['/home/user/Matlab/bin/matlab', '-nodesktop', '-nosplash', '-r "[y, z] = foo(' + str(array) + ');for ii=1:length(y) fprintf(2, \'%d %d\\n\',y(ii),z(ii)); end; exit" >/dev/null'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Метод 2 – автономный скрипт

Сначала создайте новый скрипт caller.m

 [y, z] = foo(x); for ii=1:length(y) fprintf(2, '%d %d\n',y(ii),z(ii)); end 

Обратите внимание, что x должен быть назначен при вызове из Python; сценарии используют один и тот же стек. (Не забудьте clear рабочее пространство в сценарии вызывающего абонента.)

Затем вызовите скрипт из Python

 p = subprocess.Popen(['/home/user/Matlab/bin/matlab', '-nodesktop', '-nosplash', '-r "x=' + str(array) + ';caller; exit" >/dev/null'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

Сохранение Matlab приводит к переменной Python

  • При передаче данных через трубу stdout / stderr :

    См. Это и subprocess.check_output() .

  • При обработке серьезных данных, таких как double или двоичный:

    Запишите данные во внешний файл с помощью Matlab. Затем прочитайте этот файл с помощью Python. Должен быть определен протокол, с которым обе стороны разговаривают друг с другом.