Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Start application from Matlab

Tags:

linux

matlab

I'm looking for a way to start an application from within Matlab. The thing is, my Matlab script saves some results to a file, which should then be opened in the associated application (Blender in this case).

I'm familiar with commands like

system('program_name')

or

!program_name

and some other ways, but the thing is, the application is started with the Matlab PATH, so it looks inside the Matlab directory for all kinds of libraries it needs. For instance:

>> !blender
blender: /usr/local/MATLAB/R2011a/sys/os/glnx86/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by blender)

Is there some way to start an application, which uses the global (system) PATH?

A moment ago I thought I found a tweak, namely starting a terminal from within Matlab, with some arguments (Blender filename.blend).

system('terminal -x blender /home/pieter/Red.blend')

This did work a couple of times, but now I'm getting errors after executing this command 20 times or so...

>> system('terminal -x blender /home/pieter/Red.blend')
(terminal:10982): GLib-CRITICAL **: PCRE library is compiled without UTF8 support
(terminal:10982): Terminal-CRITICAL **: Failed to parse regular expression pattern 0: PCRE library is compiled without UTF8 support

I'm using Arch Linx, by the way.


Edit:

Well, I just thought of a rather dirty solution. Matlab uses the environment variable

LD_LIBRARY_PATH

For the paths to the necessary libraries:

getenv('LD_LIBRARY_PATH')
/usr/local/MATLAB/R2011a/sys/os/glnx86:/usr/local/MATLAB/R2011a/bin/glnx86:/usr/local/MATLAB/R2011a/extern/lib/glnx86:/usr/local/MATLAB/R2011a/runtime/glnx86:/usr/local/MATLAB/R2011a/sys/java/jre/glnx86/jre/lib/i386/native_threads:/usr/local/MATLAB/R2011a/sys/java/jre/glnx86/jre/lib/i386/client:/usr/local/MATLAB/R2011a/sys/java/jre/glnx86/jre/lib/i386

So I could save this information to a variable (e.g. MatlabPath):

MatlabPath = getenv('LD_LIBRARY_PATH')

and then before I call blender do this:

setenv('LD_LIBRARY_PATH',getenv('PATH'))

Which makes Matlab use my system libraries. Then after the program has started, re-assign the old value to LD_LIBRARY_PATH:

setenv('LD_LIBRARY_PATH',MatlabPath)

So... it is a solution, but if anybody knows a cleaner way of solving the problem, let me know.

like image 948
Ailurus Avatar asked Dec 01 '11 11:12

Ailurus


1 Answers

As I indicated in my Edit above, this could be a solution:

% Save library paths
MatlabPath = getenv('LD_LIBRARY_PATH');
% Make Matlab use system libraries
setenv('LD_LIBRARY_PATH',getenv('PATH'))
disp('Starting Blender...')
system( ['blender ', Directory, FileName, '.blend'] )
% Reassign old library paths
setenv('LD_LIBRARY_PATH',MatlabPath)

However, with the other way to start an application, you can immediately return to Matlab after starting it:

% Start Blender and immediately return to Matlab
!blender Geometry.blend &

The ampersand (&) is the key to immediately return to Matlab after starting the application , but starting Blender this way I cannot provide a variable FileName like I can do with system(...).

So, anybody got a clue on how to

  • use !program_name with a variable filename

    or

  • use system(program_name) with an option such that Matlab just starts the application (and doesn't wait with returning until the application has been closed)

like image 90
Ailurus Avatar answered Oct 18 '22 22:10

Ailurus