从MATLAB调用Python函数
我需要从MATLAB调用Python函数。 我怎样才能做到这一点?
我的系统有类似的要求,这是我的解决scheme:
在MATLAB中有一个名为perl.m的函数,它允许你从MATLAB调用perl脚本。 根据你使用的版本,它将位于某处
C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\perl.m
创build一个名为python.m的副本,用python快速search并replaceperl,再次检查它设置的命令path,指向你的python安装。 你现在应该能够从MATLAB运行python脚本。
例
在python中保存为“sqd.py”的一个简单的平方函数,自然如果我正确地做了这个,我会在testinginput参数,有效数字等方面进行一些检查。
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 >>
尝试这个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);
使用Matlab 2014b可以直接从matlab调用python库。 前缀py.
被添加到所有的包名称:
wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
您可以将Python脚本embedded到C程序中 ,然后使用MATLAB将M程序 embedded 到C程序中,但是将结果转储到文件中可能会做很多工作。
您可以使用PyMat在Python中调用MATLAB函数。 除此之外, SciPy还有几个MATLAB重复函数。
但是如果您需要从MATLAB运行Python脚本,您可以尝试运行系统命令来运行脚本并将结果存储在一个文件中,稍后在MATLAB中读取。
正如@dgorissen所说,Jython是最简单的解决scheme。
只需从主页安装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实现!
我testing过的小例子工作得很好,但是你可能会发现你必须把你的Python代码目录放在sys.path
。
最简单的方法是使用MATLAB的系统函数。
所以基本上,你可以在MATLAB上执行一个Python函数,就像在命令提示符(Windows)或shell(Linux)上执行的那样:
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中的现有function来进行出价。
由于MATLAB与Java无缝集成,您可以使用Jython编写您的脚本并从MATLAB调用(您可能需要添加一个精简的JKava包装来实际调用Jython代码)。 我从来没有尝试过,但我不明白为什么它不会工作。
我已经适应了perl.m
python.m
并附上这个为其他人参考,但我似乎无法得到任何输出从Python脚本返回到MATLABvariables:(
这是我的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文件安装到我的Python发行版中。
关于MATLAB的system()
函数的一个很less知道的事实:在unixoid系统上,在MATLAB启动时,它使用环境variablesSHELL
或MATLAB_SHELL中给出的任何解释器。 所以,如果你启动MATLAB
SHELL='/usr/bin/python' matlab
任何后续的system()
调用将使用Python而不是默认的shell作为解释器。
从Matlab 2014b开始,可以直接调用Python函数。 使用前缀py,然后是模块名称,最后是函数名称,如下所示:
result = py.module_name.function_name(parameter1);
如果与Python脚本不在一个工作目录中,请确保在从Matlab调用时将脚本添加到Pythonsearchpath。
在我发布的video中查看更多详情。
这似乎是一个合适的方法来从Python到“隧道”function:
http://code.google.com/p/python-matlab-wormholes/
最大的好处是你可以用它来处理程序,这是程序的标准输出所不可能的,正如之前所build议的那样。 (请纠正我,如果你认为这是错误的 – 这将节省我很多麻烦:-))
由于Python是一种更好的粘合剂语言,因此可能更容易从Python中调用程序的MATLAB部分,反之亦然。
检查Mlabwrap 。