Как поймать вывод функции 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. «Средняя» функция является лишь примером.
- Как скопировать текст в / из буфера обмена в Go?
- Как определить, был ли запущен скрипт Python через командную строку?
- Открытие Pycharm от терминала с помощью текущего пути
- Выполнение многострочных операторов Python в однострочной командной строке
- Интерактивное построение с помощью Python через командную строку
Используйте 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. Должен быть определен протокол, с которым обе стороны разговаривают друг с другом.
- Stacking star PSF из изображения; выравнивание субпиксельных центров
- как установить six.moves.xmlrpc_client?
- как получить командную строку ORIGINAL в python? с пробелами, вкладками и т. д.
- Python в командной строке не переключается
- Ошибка при использовании функции offlineimap: getfolder () запрашивает несуществующую папку
- Выполните несколько команд командной строки из c ++
- Python sys.argv вне диапазона, не понимаю, почему
- Как воспроизвести способ, которым PyCharm запускает мой проект Python 3.4 в командной строке?
- Поверните приложение или скрипт в команду оболочки
- Отправка электронной почты в Python из исполняемого файла
- Получение вывода команды скрытой консоли?