Вызов функции Python из MATLAB

Мне нужно вызвать функцию Python из MATLAB. как я могу это сделать?


person Sarah    schedule 10.11.2009    source источник
comment
Есть ли в MATLAB поддержка сокетов?   -  person Geo    schedule 10.11.2009
comment
очевидно, у него есть поддержка сокетов code.google.com/p/msocket, если это помогает   -  person Adrian    schedule 10.11.2009
comment
Если мы добавляем параметры: github.com/kw/pymex   -  person robince    schedule 17.01.2013
comment
Относится к противоположному направлению перевода кода Matlab на Python (с упоминанием некоторых вызывающих интерфейсов): stackoverflow.com/q/9845292/1959808   -  person Ioannis Filippidis    schedule 25.09.2017
comment
Почему бы не принять ответ? Правильного ответа не существовало, когда вопрос был задан, но он есть сейчас: stackoverflow.com/a/29189167/1959808   -  person Ioannis Filippidis    schedule 25.09.2017


Ответы (13)


У меня было аналогичное требование к моей системе, и это было моим решением:

В MATLAB есть функция perl.m, которая позволяет вам вызывать скрипты perl из MATLAB. В зависимости от того, какую версию вы используете, он будет где-то вроде

C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\perl.m

Создайте копию с именем python.m, выполните быстрый поиск и замену perl на python, дважды проверьте путь к команде, который он устанавливает, чтобы указать на вашу установку python. Теперь вы должны иметь возможность запускать скрипты Python из MATLAB.

Пример

Простая функция в квадрате в Python, сохраненная как "sqd.py", естественно, если бы я делал это правильно, у меня было бы несколько проверок при проверке входных аргументов, действительных чисел и т. Д.

import sys

def squared(x):
    y = x * x
    return y

if __name__ == '__main__':
    x = float(sys.argv[1])
    sys.stdout.write(str(squared(x)))

Затем в MATLAB

>> r=python('sqd.py','3.5')
r =
12.25
>> r=python('sqd.py','5')
r =
25.0
>>
person Adrian    schedule 10.11.2009
comment
perl просто выполняет системный вызов для выполнения сценария Perl - нет передачи данных между сценарием Perl и MATLAB, кроме результатов попытки вызова Perl для результата и его состояния выхода для состояния. - mathworks.com/access/helpdesk/help/techdoc/ref /perl.html - person Jacob; 10.11.2009
comment
Я согласен, что это просто системный вызов, но зачем усложнять ситуацию с функциями и сокетами mex, если это не требуется? На простом уровне вызов python действительно имеет простую передачу данных. Я дополню ответ примером. - person Adrian; 11.11.2009
comment
+1 - Код примера MATLAB выглядит великолепно - не могли бы вы опубликовать (код / ​​ссылку) python.m? Каковы ограничения возвращаемых данных - только скаляр? - person Jacob; 11.11.2009
comment
Можем ли мы передать массив в качестве аргумента файлу Python? - person Donbeo; 06.04.2014
comment
Обратите внимание, что это работает, но это взлом, существует множество путей, которые на самом деле никуда не ведут, например, fullfile(matlabroot, 'sys\python\win32\bin\'); указывает на путь, которого на самом деле нет, сообщения об ошибках python не определены, поэтому ошибка message('MATLAB:python:<>') сообщения не будут работать в CTRL + F'd Perl.m - person jrh; 18.03.2017
comment
Этот ответ больше не актуален. Как указано ниже, с Matlab 2014b вы можете напрямую использовать (некоторые) функции Python, просто предварительно добавив py. к вызовам python . - person Giorgio Balestrieri; 11.12.2018

В Matlab 2014b библиотеки Python можно вызывать непосредственно из Matlab. Ко всем именам пакетов добавляется префикс py.:

>> wrapped = py.textwrap.wrap("example")

wrapped = 

  Python list with no properties.

    ['example']
person Community    schedule 21.03.2015
comment
Это действительно классная функция, но кажется неполной - например, я не могу использовать sklearn таким образом. Подробнее см. Мой вопрос. - person Bastian Ebeling; 30.08.2017
comment
Префикс py также может использоваться для определяемых пользователем модулей (скриптов) Python: например. names = py.mymod.search(N). Правая страница документации выглядит так: uk.mathworks .com / help / matlab / matlab_external /. - person Kouichi C. Nakamura; 22.05.2019

Попробуйте этот MEX-файл для НАСТОЯЩЕГО вызова Python из MATLAB, а не наоборот, как предлагают другие. Он обеспечивает довольно приличную интеграцию: http://algoholic.eu/matpy/

Вы можете легко сделать что-то вроде этого:

[X,Y]=meshgrid(-10:0.1:10,-10:0.1:10);
Z=sin(X)+cos(Y);
py_export('X','Y','Z')
stmt = sprintf(['import matplotlib\n' ...
'matplotlib.use(''Qt4Agg'')\n' ...
'import matplotlib.pyplot as plt\n' ...
'from mpl_toolkits.mplot3d import axes3d\n' ...
'f=plt.figure()\n' ...
'ax=f.gca(projection=''3d'')\n' ...
'cset=ax.plot_surface(X,Y,Z)\n' ...
'ax.clabel(cset,fontsize=9,inline=1)\n' ...
'plt.show()']);
py('eval', stmt);
person algoholic    schedule 29.05.2012
comment
+1 спасибо за отличное решение. Пожалуйста, рассмотрите вариант размещения проекта на GitHub, чтобы другие тоже могли его найти. - person Amro; 03.08.2012
comment
Для тех, кому интересно, я только что нашел два других похожих проекта: pythoncall и pymex (сам еще не пробовал) - person Amro; 04.08.2012

Вы можете встроить свой скрипт Python в программу C, а затем MEX программа C с MATLAB, но это может быть много работы по сравнению с сохранением результатов в файл.

Вы можете вызывать функции MATLAB в Python, используя PyMat. Помимо этого, SciPy имеет несколько дублирующих функций MATLAB.

Но если вам нужно запустить сценарии Python из MATLAB, вы можете попробовать запустить system, чтобы запустить сценарий и сохранить результаты в файле и прочитать его позже в MATLAB.

person Jacob    schedule 10.11.2009

Как сказал @dgorissen, Jython - самое простое решение.

Просто установите Jython с домашней страницы.

Потом:

javaaddpath('/path-to-your-jython-installation/jython.jar')

import org.python.util.PythonInterpreter;

python = PythonInterpreter; %# takes a long time to load!
python.exec('import some_module');
python.exec('result = some_module.run_something()');
result = python.get('result');

См. Несколько примеров в документации.

Осторожно: я никогда не работал с Jython, и кажется, что стандартная библиотека, известная по CPython, не полностью реализована в Jython!

Небольшие примеры, которые я тестировал, работали отлично, но вы можете обнаружить, что вам нужно добавить свой каталог кода Python к sys.path.

person kay    schedule 03.08.2012
comment
это определенно легче интегрировать. Жаль, что на данный момент вы не можете использовать такие модули, как Numpy / Scipy / matplotlib с Jython (из-за расширений C). Эти библиотеки действительно сильная сторона Python, когда дело доходит до научных вычислений. - person Amro; 04.08.2012
comment
Сложно ответить на вопрос. Можно просто открыть Python (из Matlab) и писать / читать из оболочки REPL. Думаю, бесшовная интеграция возможна только с Jython. Опять же, используя ctypes, можно легко интегрировать Octave, но не Matlab, в CPython. - person kay; 04.08.2012
comment
(Конечно, Octave - ничтожная замена Matlab.) - person kay; 04.08.2012
comment
CPython позволяет встраивать свой интерпретатор в программы на C (это то, что @algoholic сделала с помощью MEX-файлы). Основная часть кода связана с преобразованием между типами Python (numpy.ndarray использовался как эквивалент матриц MATLAB N-D) и типами MATLAB (на самом деле mxArray в MEX). - person Amro; 04.08.2012
comment
Все это похоже на то, что вы показали выше, только с использованием Python C API вместо Jython Java API для оценки произвольных выражений в интерпретаторе ... Кроме того, вы можете импортировать любой установленный модуль Python, включая весь ансамбль PyLab - person Amro; 04.08.2012

Самый простой способ сделать это - использовать system.

В общем, вы должны выполнить функцию Python в MATLAB, как в командной строке (Windows) или оболочке (Linux):

system('python pythonfile.py')

Вышеупомянутое предназначено для простого запуска файла Python. Если вы хотите запустить функцию Python (и дать ей несколько аргументов), вам понадобится что-то вроде:

system('python pythonfile.py argument')

В качестве конкретного примера возьмите код Python из ответа Адриана на этот вопрос и сохраните его в файл Python, то есть test.py. Затем поместите этот файл в свой каталог MATLAB и выполните следующую команду на MATLAB:

system('python test.py 2')

И вы получите на выходе 4 или 2 ^ 2.

Примечание: MATLAB ищет в текущем каталоге MATLAB любой файл Python, который вы указываете с помощью команды system.

Это, вероятно, самый простой способ решить вашу проблему, поскольку вы просто используете существующую функцию в MATLAB для выполнения ваших ставок.

person killajoule    schedule 19.03.2012
comment
Это то, что я делал, но столкнулся с загадочной проблемой - одним из аргументов моего скрипта python является файл. При вызове из MATLAB сценарий python не может найти файл (несмотря на то, что все сценарии находятся в том же каталоге, что и файл, и несмотря на указание полного пути в сценарии MATLAB). Сводит с ума. - person whlteXbread; 28.09.2012
comment
Предложения выглядят великолепно, но я получаю сообщение об ошибке «Python» не распознается как внутренняя или внешняя команда, работающая программа или командный файл. - person NeStack; 07.06.2019

Начиная с Matlab 2014b функции Python можно вызывать напрямую. Используйте префикс py, затем имя модуля и, наконец, имя функции, например:

result = py.module_name.function_name(parameter1);

Не забудьте добавить скрипт в путь поиска Python при вызове из Matlab, если вы находитесь в другом рабочем каталоге, чем у скрипта Python.

Дополнительные сведения см. здесь.

person Altermarkive    schedule 12.10.2016

Я адаптировал perl.m к python.m и приложил это для справки для других, но я не могу получить какой-либо вывод из сценариев Python, который нужно вернуть в переменную MATLAB :(

Вот мой M-файл; обратите внимание, я указываю прямо на папку Python, C:\python27_64, в моем коде, и это изменится в вашей системе.

function [result status] = python(varargin)
cmdString = '';
for i = 1:nargin
    thisArg = varargin{i};
    if isempty(thisArg) || ~ischar(thisArg)
        error('MATLAB:python:InputsMustBeStrings', 'All input arguments must be valid strings.');
    end
    if i==1
        if exist(thisArg, 'file')==2
            if isempty(dir(thisArg))
                thisArg = which(thisArg);
            end
        else
            error('MATLAB:python:FileNotFound', 'Unable to find Python file: %s', thisArg);
        end
    end
  if any(thisArg == ' ')
    thisArg = ['"', thisArg, '"'];
  end
  cmdString = [cmdString, ' ', thisArg];
end
errTxtNoPython = 'Unable to find Python executable.';
if isempty(cmdString)
  error('MATLAB:python:NoPythonCommand', 'No python command specified');
elseif ispc
  pythonCmd = 'C:\python27_64';
  cmdString = ['python' cmdString];  
  pythonCmd = ['set PATH=',pythonCmd, ';%PATH%&' cmdString];
  [status, result] = dos(pythonCmd)
else
  [status ignore] = unix('which python'); %#ok
  if (status == 0)
    cmdString = ['python', cmdString];
    [status, result] = unix(cmdString);
  else
    error('MATLAB:python:NoExecutable', errTxtNoPython);
  end
end
if nargout < 2 && status~=0
  error('MATLAB:python:ExecutionError', ...
        'System error: %sCommand executed: %s', result, cmdString);
end

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

Решил мою проблему, исходный perl.m указывает на установку Perl в папке MATLAB путем обновления < strong> PATH, а затем вызовите Perl. Вышеупомянутая функция указывает на мою установку Python. Когда я вызвал свой function.py файл, он находился в другом каталоге и вызвал другие файлы в этом каталоге. Они не отражены в PATH, и мне пришлось легко установить файлы Python в свой дистрибутив Python.

person Carel    schedule 24.02.2012

Малоизвестный (и немного задокументированный) факт о < a href = "http://en.wikipedia.org/wiki/MATLAB" rel = "nofollow"> system() функция MATLAB: в системах unixoid он использует любой интерпретатор, указанный в переменной окружения SHELL или MATLAB_SHELL во время запуска MATLAB. Итак, если вы запустите MATLAB с

SHELL='/usr/bin/python' matlab

любые последующие system() вызовы будут использовать Python вместо вашей оболочки по умолчанию в качестве интерпретатора.

person quazgar    schedule 03.01.2013
comment
у меня не сработало в Windows .. (я создал env. var. обычным способом) - person Amro; 03.01.2013
comment
Хм, я полагаю, вы проверили из Matlab, что переменная действительно установлена? Но я не был бы слишком удивлен, если бы у Matlab были разные критерии в Windows, чтобы решить, какую оболочку использовать. - person quazgar; 03.01.2013
comment
да, я проверил getenv('SHELL') в MATLAB .. В любом случае вы, вероятно, должны упомянуть, что этот трюк, к сожалению, только для Linux / Mac - person Amro; 03.01.2013
comment
+1 здесь, кажется, упоминается переменная SHELL: mathworks.com/help /matlab/ref/matlabunix.html (на странице-аналоге Windows ее нет) - person Amro; 03.01.2013

Поскольку MATLAB легко интегрируется с Java, вы можете использовать Jython, чтобы написать сценарий и вызвать его из MATLAB (возможно, вам придется добавить тонкую чистую оболочку JKava, чтобы фактически вызвать код Jython). Я никогда не пробовал, но не понимаю, почему это не сработает.

person dgorissen    schedule 21.02.2011

Как сказал Даниэль, вы можете запускать команды python прямо из Matlab, используя py. команда. Чтобы запустить любую из библиотек, вам просто нужно убедиться, что Malab запускает среду python, в которую вы установили библиотеки:

На Mac:

  • Откройте новое окно терминала;

  • type: which python (чтобы узнать, где установлена ​​версия python по умолчанию);

  • Перезагрузите Matlab;

  • введите: pyversion ('/ anaconda2 / bin / python') в командной строке (очевидно, замените на свой путь).
  • Теперь вы можете запустить все библиотеки в вашей установке python по умолчанию.

Например:

py.sys.version;

py.sklearn.cluster.dbscan

person Rodrigo Coelho    schedule 27.04.2018
comment
Это самое простое решение, которое я нашел здесь, оно должно быть намного выше! - person NeStack; 07.06.2019


Поскольку Python является лучшим связующим языком, возможно, будет проще вызвать MATLAB часть вашей программы из Python, а не наоборот.

Ознакомьтесь с Mlabwrap.

person Andrew Wagner    schedule 16.04.2010