Is it possible to run MATLAB functions from within Python? I search the internet, I could only find PyMat. The bad thing is the compiled version only supports Python2.2 and I am using 2.6. So I tried to download the source code, so I can compile it for myself. But I cannot compile it, VC++ express seems not to have the necessary functionalities to compile it. Does anyone have the compile version for PC? or any substitutes for PyMat? Thanks
-
8numpy is your friend when matlab disappoint you – Simon Bergot Oct 14 '11 at 15:59
10 Answers
I know this is an old question and has been answered. But I was looking for the same thing (for the Mac) and found that there are quite a few options with different methods of interacting with matlab and different levels of maturity. Here's what I found:
pymat
A low level interface to Matlab using the matlab engine (libeng
) for communication (basically a library that comes with matlab). The module has to be compiled and linked with libeng.
http://pymat.sourceforge.net
Last updated: 2003
pymat2
A somewhat short lived continuation of the pymat development. Seems to work on windows (including 64bit), linux and mac (with some changes).
https://code.google.com/p/pymat2/
Last updated: 2012
mlabwrap
A high level interface that also comes as a module which needs compilation and linking against libeng
. It exposes Matlab functions to python so you can do fun stuff like
mlab.plot(x, y, 'o')
http://mlabwrap.sourceforge.net
Last updated: 2009
mlab
A repackaging effort of mlabwrap. Basically it replaces the c++ code that links against 'libeng' in mlabwrap with a python module (matlabpipe) that communicates with matlab through a pipe. The main advantage of this is that it doesn't need compilation of any kind.
Unfortunately the package currently has a couple of bugs and doesn't seem to work on the mac at all. I reported a few of them but gave up eventually. Also, be prepared for lots of trickery and a bunch of pretty ugly hacks if you have to go into the source code ;-) If this becomes more mature it could be one of the best options.
https://github.com/ewiger/mlab
last update: 2013
pymatlab
A newer package (2010) that also interacts with Matlab through libeng
. Unlike the other packages this one loads the engine library through ctypes thus no compilation required. Its not without flaws but still being maintained and the (64bit Mac specific) issues I found should be easy enough to fix.
(edit 2014-05-20: it seems those issues have already been fixed in the source so things should be fine with 0.2.4)
http://pymatlab.sourceforge.net
last update: 2014
python-matlab-bridge
Also a newer package that is still actively maintained. Communicates with Matlab through some sort of socket. Unfortunately the exposed functions are a bit limited. I couldn't figure out how to invoke a function that takes structs as parameters. Requires zmq, pyzmq and IPython which are easy enough to install.
http://arokem.github.io/python-matlab-bridge
last update: 2014

- 1,533
- 16
- 21
-
2+1 for your post. The question is old (as you said) but still relevant. The older answers are outdated since there is a lot of room for improvement in Matlab-Python cross-talk. – Christian O'Reilly Aug 26 '15 at 22:04
-
1In the spirit of updating older answerd to still relevant questions: Since MATLAB 2014b, Mathworks has included official support for communication between python and matlab: https://se.mathworks.com/help/matlab/matlab-engine-for-python.html – 5Ke Jul 18 '17 at 09:10
Another option is Mlabwrap
:
Mlabwrap is a high-level python to Matlab® bridge that lets Matlab look like a normal python library.
It works well with numpy arrays. An example from the home page:
>>> from mlabwrap import mlab; from numpy import *
>>> xx = arange(-2*pi, 2*pi, 0.2)
>>> mlab.surf(subtract.outer(sin(xx),cos(xx)))

- 120,335
- 23
- 147
- 134
-
1This [page](http://obasic.net/how-to-install-mlabwrap-on-windows) contains steps to get started with `mlabwrap` – Amro Aug 03 '12 at 22:08
-
Note that there is also [``mlab``](https://github.com/ewiger/mlab), "a repackaging effort [of mlabwrap] to make things up-to-date". – Florian Brucker Apr 29 '14 at 11:24
-
@FlorianBrucker: mlab is somehow broken, at least it does not work for me correctly... – arc_lupus Feb 11 '15 at 09:27
PyMat looks like it's been abandoned.
I'm assuming you are on windows so you could always do the simplest approach and use Matlab's COM interface:
>>> import win32com.client
>>> h = win32com.client.Dispatch('matlab.application')
>>> h.Execute ("plot([0 18], [7 23])")
>>> h.Execute ("1+1")
u'\nans =\n\n 2\n\n'
More info here

- 106,305
- 20
- 172
- 230
-
Hey, is there a way to get the Python script to halt if a MATLAB command produces an error or even print out the error? I noticed that Python ignores errors by default and moves on through the script. -Thanks – Usagi Jun 07 '11 at 21:36
-
is the run statement of matlab to run a script executable using this command? – girl101 Mar 28 '18 at 09:31
There is a python-matlab bridge which is unique in the sense that Matlab runs in the background so you don't have the startup cost each time you call a Matlab function. https://github.com/jaderberg/python-matlab-bridge
it's as easy as downloading and the following code:
from pymatbridge import Matlab
mlab = Matlab(matlab='/Applications/MATLAB_R2011a.app/bin/matlab')
mlab.start()
res = mlab.run('path/to/yourfunc.m', {'arg1': 3, 'arg2': 5})
print res['result']
where the contents of yourfunc.m would be something like this:
%% MATLAB
function lol = yourfunc(args)
arg1 = args.arg1;
arg2 = args.arg2;
lol = arg1 + arg2;
end

- 562
- 5
- 10
-
Max, do you know if there is a way to pass multiple arguments to the matlab function without using a dictionary? That would be very handy! Thank you! – Barmaley Jan 27 '15 at 22:53
I would like to add one more option to the excellent summary by Lukas:
matlab_wrapper
The advantage of matlab_wrapper is that it is pure Python library and you will not need to compile anything. Works in GNU/Linux, Windows and OSX.
https://github.com/mrkrd/matlab_wrapper
Disclaimer: I'm the author of matlab_wrapper
see this page: An Open-Source MATLAB®-to-Python® Compiler
-
-
1@Francesco, sorry I do not know! I just tried some simple examples about two years ago. I've been using both matlab and python. I just stick to certain data structures, and pass data between them. – ying17zi Jun 12 '13 at 19:40
You can use the official matlab engine by installing Matlab, then building python engine from its extern files. You can check the guide website below: ---Thanks for the advice in the first comment of this answer --- the essential step in brief are (On Windows platform, other can checked in the url below): 1. download and then install matlab, the version must be R2014 or later. 2. open a PowerShell window under admin, then:
cd "matlabroot\extern\engines\python"
3. use command-line below to install:
python setup.py install
The admin is essential, or you'll fail to build it.
For more information, you can click the official start sheet below: http://cn.mathworks.com/help/matlab/matlab_external/install-the-matlab-engine-for-python.html

- 154
- 1
- 7
-
While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. - [From Review](/review/low-quality-posts/10178966) – jezrael Nov 12 '15 at 09:27
-
newer versions of matlab seem to provide a module that allows you to call matlab functions from within python. see here and here.

- 2,310
- 5
- 23
- 32
-
I wrote a tutorial of how to use it with classes - http://www.cloud-rocket.com/2016/08/using-matlab-compiled-class-from-python/ – Meir Tseitlin Sep 01 '16 at 06:49
2 more options for you to consider:
Follow the official MATLAB docs: Create a Python Application with MATLAB Code. This will create a Python library that includes MATLAB runtime which you can call from within your Python code.
Run your MATLAB code in GNU Octave then call it from Python using Oct2Py

- 3,280
- 3
- 15
- 23
This is the solution from Mathworks.
In your current folder, create a MATLAB script in a file named triarea.m.
function a = triarea(b,h)
a = 0.5*(b.* h);
Meanwhile, you run the python code as follows,
import matlab.engine
eng = matlab.engine.start_matlab()
eng.addpath('your/code/folders/')
ret = eng.triarea(1.0,5.0)
print(ret)
>>> 2.5
Matlab already provides the python module of the engine, to install that you can do the following,
cd matlab_root_folder/extern/engines/python
python setup.py install
You are all done! Tips: you need to be careful about the data type, the engine is not friendly with numpy. You need to convert the data first.
mat_array = matlab.double(list(my_numpy_array))
eng.my_matlabe_function(mat_array )

- 1,331
- 1
- 12
- 13