从MATLAB调用Python函数

时间:2009-11-10 12:57:59

标签: python matlab language-interoperability

我需要从MATLAB调用Python函数。我怎么能这样做?

13 个答案:

答案 0 :(得分:42)

我对我的系统有类似的要求,这是我的解决方案:

在MATLAB中有一个名为perl.m的函数,它允许您从MATLAB调用perl脚本。根据您使用的版本,它将位于

之类的位置
C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\perl.m

创建一个名为python.m的副本,快速搜索并用python替换perl,仔细检查它设置的命令路径以指向你的python安装。您现在应该能够从MATLAB运行python脚本。

示例

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
>>

答案 1 :(得分:23)

使用Matlab 2014b python库可以称为directly from matlab。所有数据包名称都添加了前缀py.

wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python

答案 2 :(得分:18)

尝试使用这个MEX文件来实现从MATLAB调用Python而不是像其他人所说的那样。它提供了相当不错的集成: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);

答案 3 :(得分:12)

您可以embed your Python script in a C program然后MEX the C program with MATLAB但是将结果转储到文件可能需要做很多工作。

您可以使用PyMat在Python中调用MATLAB函数。除此之外,SciPy有几个MATLAB重复函数。

但是如果你需要从MATLAB运行Python脚本,你可以尝试运行system命令来运行脚本并将结果存储在一个文件中,稍后在MATLAB中阅读。

答案 4 :(得分:11)

正如@dgorissen所说,Jython是最简单的解决方案。

只需从homepage安装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');

有关示例,请参阅the documentation

注意:我从未真正使用过Jython,似乎CPython中可能知道的标准库在Jython中没有完全实现!

我测试的小例子工作得很好,但您可能会发现必须将Python代码目录添加到sys.path

答案 5 :(得分:7)

最简单的方法是使用MATLABsystem功能。

基本上,你可以像在命令提示符(Windows)或shell(Linux)上那样在MATLAB上执行Python函数:

system('python pythonfile.py')

以上是为了简单地运行Python文件。如果你想运行一个Python函数(并给它一些参数),那么你需要像:

system('python pythonfile.py argument')

有关具体示例,请参阅Adrian对此问题的答案中的Python代码,并将其保存到Python文件,即test.py。然后将此文件放在MATLAB目录中并在MATLAB上运行以下命令:

system('python test.py 2')

你将获得4或2 ^ 2的输出。

注意:MATLAB在当前的MATLAB目录中查找您使用system命令指定的任何Python文件。

这可能是解决问题的最简单方法,因为您只需使用MATLAB中的现有函数进行出价。

答案 6 :(得分:4)

我已经将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

编辑:

通过更新 PATH 然后调用Perl,原来的perl.m指向MATLAB文件夹中的Perl安装,解决了我的问题。上面的函数指向我的Python安装。当我调用我的function.py文件时,它位于不同的目录中并调用该目录中的其他文件。这些没有反映在 PATH 中,我不得不将我的Python文件easy_install到我的Python发行版中。

答案 7 :(得分:4)

关于documented system()函数的一个鲜为人知的(MATLAB}事实:在unixoid系统上,它使用环境变量SHELL中给出的任何解释器或在启动MATLAB时MATLAB_SHELL。所以如果你用

启动MATLAB
SHELL='/usr/bin/python' matlab

任何后续system()次调用都会使用Python而不是您的默认shell作为解释器。

答案 8 :(得分:3)

由于MATLAB与Java无缝集成,您可以使用Jython编写脚本并从MATLAB调用它(您可能需要添加一个瘦的纯JKava包装器来实际调用Jython代码)。我从未尝试过,但我不明白为什么它不起作用。

答案 9 :(得分:3)

从Matlab开始,2014b可以直接调用Python函数。 使用前缀py,然后使用模块名称,最后使用函数名称,如下所示:

-=

如果您在与Python脚本不同的工作目录中,请确保在从Matlab调用时将脚本添加到Python搜索路径。

在我发布的video中查看更多详情。

答案 10 :(得分:1)

这似乎是一种从PythonMATLAB“隧道”功能的合适方法:

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

最大的好处是你可以使用它处理ndarray,这是之前建议的程序的标准输出所不可能的。 (请纠正我,如果你认为这是错误的 - 它会省去很多麻烦:-))

答案 11 :(得分:1)

像Daniel说的那样你可以使用py直接从Matlab运行python命令。命令。要运行任何库,您只需确保Malab运行安装库的python环境:

在Mac上:

  • 打开一个新的终端窗口;

  • type:python(找出安装python默认版本的位置);

  • 重启Matlab;

  • 类型:pyversion(&#39; / anaconda2 / bin / python&#39;),在命令行中(显然用你的路径替换)。
  • 您现在可以在默认的python安装中运行所有库。

例如:

  
    

py.sys.version;

         

py.sklearn.cluster.dbscan

  

答案 12 :(得分:0)

由于Python是一种更好的粘合语言,因此从Python调用程序的MATLAB部分可能更容易,反之亦然。

查看Mlabwrap