Мне нужно вызвать функцию Python из MATLAB. как я могу это сделать?
Вызов функции Python из MATLAB
Ответы (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
>>
perl
просто выполняет системный вызов для выполнения сценария Perl - нет передачи данных между сценарием Perl и MATLAB, кроме результатов попытки вызова Perl для результата и его состояния выхода для состояния. - mathworks.com/access/helpdesk/help/techdoc/ref /perl.html
- person Jacob; 10.11.2009
python.m
? Каковы ограничения возвращаемых данных - только скаляр?
- person Jacob; 11.11.2009
fullfile(matlabroot, 'sys\python\win32\bin\');
указывает на путь, которого на самом деле нет, сообщения об ошибках python не определены, поэтому ошибка message('MATLAB:python:<>')
сообщения не будут работать в CTRL + F'd Perl.m
- person jrh; 18.03.2017
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']
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);
Вы можете встроить свой скрипт Python в программу C, а затем MEX программа C с MATLAB, но это может быть много работы по сравнению с сохранением результатов в файл.
Вы можете вызывать функции MATLAB в Python, используя PyMat. Помимо этого, SciPy имеет несколько дублирующих функций MATLAB.
Но если вам нужно запустить сценарии Python из MATLAB, вы можете попробовать запустить system, чтобы запустить сценарий и сохранить результаты в файле и прочитать его позже в MATLAB.
Как сказал @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
.
numpy.ndarray
использовался как эквивалент матриц MATLAB N-D) и типами MATLAB (на самом деле mxArray
в MEX).
- person Amro; 04.08.2012
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 для выполнения ваших ставок.
Начиная с Matlab 2014b функции Python можно вызывать напрямую. Используйте префикс py, затем имя модуля и, наконец, имя функции, например:
result = py.module_name.function_name(parameter1);
Не забудьте добавить скрипт в путь поиска Python при вызове из Matlab, если вы находитесь в другом рабочем каталоге, чем у скрипта Python.
Дополнительные сведения см. здесь.
Я адаптировал 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.
Малоизвестный (и немного задокументированный) факт о < 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 вместо вашей оболочки по умолчанию в качестве интерпретатора.
getenv('SHELL')
в MATLAB .. В любом случае вы, вероятно, должны упомянуть, что этот трюк, к сожалению, только для Linux / Mac
- person Amro; 03.01.2013
Поскольку MATLAB легко интегрируется с Java, вы можете использовать Jython, чтобы написать сценарий и вызвать его из MATLAB (возможно, вам придется добавить тонкую чистую оболочку JKava, чтобы фактически вызвать код Jython). Я никогда не пробовал, но не понимаю, почему это не сработает.
Как сказал Даниэль, вы можете запускать команды python прямо из Matlab, используя py. команда. Чтобы запустить любую из библиотек, вам просто нужно убедиться, что Malab запускает среду python, в которую вы установили библиотеки:
На Mac:
Откройте новое окно терминала;
type: which python (чтобы узнать, где установлена версия python по умолчанию);
Перезагрузите Matlab;
- введите: pyversion ('/ anaconda2 / bin / python') в командной строке (очевидно, замените на свой путь).
- Теперь вы можете запустить все библиотеки в вашей установке python по умолчанию.
Например:
py.sys.version;
py.sklearn.cluster.dbscan
Это кажется подходящим методом для "туннелирования" функций из Python в MATLAB:
http://code.google.com/p/python-matlab-wormholes/ а>
Большим преимуществом является то, что вы можете обрабатывать с его помощью ndarrays, что невозможно при стандартном выводе программ, как предлагалось ранее. (Пожалуйста, поправьте меня, если вы думаете, что это неправильно - это избавило бы меня от многих проблем :-))