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

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

63 голосов
/ 10 ноября 2009

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

Ответы [ 13 ]

42 голосов
/ 10 ноября 2009

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

В 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
>>
23 голосов
/ 22 марта 2015

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

wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
18 голосов
/ 29 мая 2012

Попробуйте этот 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);
12 голосов
/ 10 ноября 2009

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

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

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

11 голосов
/ 04 августа 2012

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

7 голосов
/ 19 марта 2012

Самый простой способ сделать это - использовать функцию system MATLAB .

Таким образом, в основном вы выполняете функцию 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 для выполнения ваших ставок.

4 голосов
/ 03 января 2013

Малоизвестный (и мало задокументированный ) факт о функции MATLAB * system(): в системах unixoid он использует любой интерпретатор, заданный в переменной окружения SHELL или MATLAB_SHELL во время запуска MATLAB. Так что, если вы начнете MATLAB с

SHELL='/usr/bin/python' matlab

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

4 голосов
/ 24 февраля 2012

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

Вот мой М-файл; Обратите внимание, что я указываю прямо на папку 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, обновив PATH и затем вызвав Perl. Функция выше указывает на мою установку Python. Когда я вызвал мой function.py файл, он находился в другом каталоге и назвал другие файлы в этом каталоге. Они не отражены в PATH , и мне пришлось легко_установить мои файлы Python в мой дистрибутив Python.

3 голосов
/ 12 октября 2016

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

result = py.module_name.function_name(parameter1);

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

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

3 голосов
/ 21 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...