## Running Matlab as a Python subprocess

Although NumPy and Scipy usually provide all the tools you need (and more) for scientific computing, sometimes you may want to use a bit of Matlab in the background. In my case, for example, to use `rref`

. Conveniently, Matlab can be run as a Python subprocess, provided of course that Matlab is installed on your system.

import os from subprocess import Popen from scipy.io import loadmat from scipy.io import savemat import numpy as np infile = os.path.join(os.path.dirname(__file__), 'infile.mat') outfile = os.path.join(os.path.dirname(__file__), 'outfile.mat') with open(infile, 'wb+') as fp: pass with open(outfile, 'wb+') as fp: pass A = np.array([ [1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], dtype=float) indict = {'A': A} savemat(infile, indict) matlab = ['matlab'] options = ['-nosplash', '-r'] command = ["load('{0}');[R, jb]=rref(A);save('{1}');exit;".format(infile, outfile)] # on mac use the full path to matlab or add the path to your .profile # matlab = ['/Applications/MATLAB_R2016a.app/bin/matlab'] # on windows use: # options = ['-nosplash', '-wait', '-r'] p = Popen(matlab + options + command) stdout, stderr = p.communicate() outdict = loadmat(outfile) jb = outdict['jb'].tolist()[0] print jb # should be [1, 2, 3, 4] # don't forget Matlab is 1-based # so convert to [0, 1, 2, 3]