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

58

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

  • 2
    Есть ли в MATLAB поддержка сокетов?
  • 1
    очевидно, у него есть поддержка сокетов code.google.com/p/msocket, если это поможет
Показать ещё 4 комментария
Теги:
language-interoperability

12 ответов

37

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

В 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
>>
  • 2
    perl просто выполняет системный вызов для выполнения сценария Perl - нет никакой передачи данных между сценарием Perl и MATLAB, за исключением «результатов попытки вызова Perl к результату и его состояния выхода в состояние». - mathworks.com/access/helpdesk/help/techdoc/ref/perl.html
  • 0
    Я согласен, что это просто делает системный вызов, но зачем усложнять мекс-функции и сокеты, если это не требуется? На простом уровне вызов Python имеет простую передачу данных. Я обновлю ответ с примером.
Показать ещё 4 комментария
17

Попробуйте этот MEX файл для ACTUALLY вызова 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);
  • 1
    +1 спасибо за отличное решение. Пожалуйста, рассмотрите возможность размещения проекта на GitHub, чтобы другие тоже могли его найти.
  • 2
    Для тех, кто заинтересован, я только что нашел два других похожих проекта: pythoncall и pymex (сам еще не пробовал)
16

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

wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
  • 4
    Это действительно классная функция - но, кажется, она неполная - например, я не могу использовать sklearn таким образом. Подробнее см. Мой вопрос .
11

Как сказал @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.

  • 2
    это определенно легче интегрировать. Жаль, что на данный момент вы не можете использовать такие модули, как Numpy / Scipy / matplotlib с Jython (за счет расширений C). Эти библиотеки действительно сильные стороны Python, когда дело доходит до научных вычислений
  • 0
    Сложно ответить на вопрос. Можно просто открыть Python (из Matlab) и записать / прочитать из оболочки REPL. Я предполагаю, что бесшовная интеграция будет возможна только с Jython. С другой стороны, используя ctypes, было бы легко интегрировать Octave, но не Matlab, в CPython.
Показать ещё 3 комментария
11

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

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

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

7

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

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

system('python pythonfile.py')

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

system('python pythonfile.py argument')

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

system('python test.py 2')

И вы получите как результат 4 или 2 ^ 2.

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

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

  • 0
    Это то, что я делал, но столкнулся с загадочной проблемой - один из аргументов моего скрипта на python - это файл. При вызове из MATLAB сценарий python не может найти файл (несмотря на то, что все сценарии находятся в том же каталоге, что и файл, и несмотря на указание полного пути в сценарии MATLAB). Maddening.
4

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

3

Немного известно (и немного documented) факт о MATLAB system(): в unixoid системах он использует любой интерпретатор, заданный в переменной окружения SHELL или MATLAB_SHELL во время запуска MATLAB. Поэтому, если вы запустите MATLAB с помощью

SHELL='/usr/bin/python' matlab

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

  • 0
    не работает для меня в Windows .. (я создал env. var. обычным способом)
  • 0
    Хм, я полагаю, вы проверили из Matlab, что переменная действительно установлена? Но я не был бы слишком удивлен, если бы у Matlab были другие критерии в Windows, чтобы решить, какую оболочку использовать.
Показать ещё 3 комментария
3

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

Вот мой M файл; note Я указываю прямо в папку 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

EDIT:

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

2

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

result = py.module_name.function_name(parameter1);

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

Подробнее см. в видео, который я разместил.

1

Это кажется подходящим методом для "туннельных" функций от Python до MATLAB:

http://code.google.com/p/python-matlab-wormholes/

Большим преимуществом является то, что вы можете обрабатывать ndarrays с ним, что невозможно в стандартном выпуске программ, как это было предложено ранее. (Пожалуйста, поправьте меня, если вы считаете, что это не так - это избавит меня от многих проблем:-))

0

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

Отъезд Mlabwrap.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню