Set up a MATLAB+Python environment
Part 1 of the Python Is The Ultimate MATLAB Toolbox series.
What you’ll need
- MATLAB version 2020b or newer (some MATLAB versions older than 2020b support Python, but the farther back you go, the more more limitations and problems you’ll hit). The latest release, 2022a, is definitely recommended.
- A Python installation
supported by your version of MATLAB.
I strongly recommend the
Anaconda
Python distribution 1
for
two reasons: 1) it comes with a deep stack of Python modules and external
tools useful for scientific computing and 2) its
condacommand has the ability to create virtual environments with specific shared library versions. Control over shared library versions in Python is invaluable for troubleshooting MATLAB errors (or crashes) when importing complex modules such as NumPy, SciPy, and statsmodels (among others) in MATLAB.
Step 1: pyenv
The first command to issue in a MATLAB console is pyenv. It will
either come up empty, or it will print information about the Python
installation MATLAB found:
>> pyenv
ans =
PythonEnvironment with properties:
Version: "3.9"
Executable: "/usr/local/anaconda3/2021.05/envs/matpy/bin/python"
Library: "/usr/local/anaconda3/2021.05/envs/matpy/lib/libpython3.9.so"
Home: "/usr/local/anaconda3/2021.05/envs/matpy"
Status: Loaded
ExecutionMode: InProcess
ProcessID: "840228"If pyenv comes up empty, set 'Version' to the path of the Python
executable you want to use:
>> pyenv('Version', "/usr/local/anaconda3/2021.05/envs/matpy/bin/python")On a Windows computer your entry might be
>> pyenv('Version', "C:/ProgramData/Anaconda3/python.exe")(Yes, forward slashes work in Windows too.)
The best way to have MATLAB recognize a specific virtual environment is to first activate the virtual environment in a terminal, then start MATLAB from that terminal.
Step 2: Does it work?
A quick way to determine if your MATLAB and Python environments are compatible is to import the NumPy module into MATLAB:
>> np = py.importlib.import_module('numpy')NumPy and MATLAB have several shared libraries in common so importing NumPy into MATLAB is a good litmus test for overall MATLAB/Python compatibility. Several things may happen:
- A long list of function names appears.
Python Error: ImportErrorUnable to resolve the name numpySegmentation violation detected
The first case indicates the import was successful. If you see the functions, congratulations, you should be able to use MATLAB and Python together effectively.
The last three errors can be caused by a Python installation that is not version-consistent with, or not visible to MATLAB; the Python installation does not have NumPy installed; or you need to create a virtual environment configured with shared library versions that are consistent with MATLAB’s shared libraries.
Possible work-arounds to library conflicts:
-
Change the
ExecutionModesetting toOutOfProcessExecutionMode: InProcess>> pyenv("ExecutionMode","OutOfProcess") -
Create a conda environment with library versions that more closely match MATLAB’s. Unfortunately there’s no obvious way to identify either the libraries or the versions so experimentation is needed. The conda environment that works well for me with MATLAB 2020b is
Linux (Ubuntu 20.04) + MATLAB 2020b
conda create --name matpy python=3.8.8 libgcc-devel_linux-64=8.4.0 \ libgcc-ng=8.4.0 geopandas matplotlib pulp cartopy austin faker \ pint poliastro psycopg2 pymongo pythran redis redis-py simanneal \ netCDF4 descartes h5py statsmodels pyyaml psutil lxml dask \ distributed paramiko sympy requests pyflakes uncertainties seaborn \ cython pytest scikit-umfpack ipython -c conda-forgeWindows 10 + MATLAB 2020b
conda create --name matpy python=3.8.8 geopandas matplotlib pulp ^ cartopy faker pint poliastro psycopg2 pymongo pythran redis ^ redis-py statsmodels simanneal netCDF4 descartes h5py pyyaml ^ psutil lxml dask distributed paramiko sympy requests pyflakes ^ cython uncertainties seaborn pytest ipython -c conda-forgemacOS (Catalina, Big Sur) + MATLAB 2020b
conda create --name matpy python=3.8.8 geopandas matplotlib pulp \ cartopy austin faker intel-openmp=2021.2.0 llvm-openmp=10.0.0 \ libllvm10=10.0.1 llvmlite=0.36.0 \ pint poliastro psycopg2 pymongo pythran redis redis-py simanneal \ netCDF4 descartes h5py statsmodels pyyaml psutil lxml dask \ distributed paramiko sympy requests pyflakes uncertainties seaborn \ cython pytest ipython -c conda-forge
I’ve found MATLAB 2022a to work cleanly with the base Anaconda 2021.05 installation; no finely-tuned conda environment needed.
-
free for individual use but requires a purchased license for commercial use ↩︎
