从Matlab开始应用程序

我正在寻找一种方法来从Matlab内启动一个应用程序。 事情是,我的Matlab脚本将一些结果保存到一个文件,然后应该打开相关的应用程序(在这种情况下,搅拌机)。

我很熟悉像

system('program_name') 

要么

 !program_name 

还有一些其他的方法,但是事实是,应用程序是从Matlab PATH开始的,所以它在Matlab目录里查找它需要的各种库。 例如:

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

有没有办法启动一个使用全局(系统)PATH的应用程序?

刚才我以为我发现一个调整,即从Matlab内启动一个terminal,一些参数(Blender filename.blend)。

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

这确实工作了几次,但现在我得到错误后执行此命令20次左右…

 >> 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 

顺便说一下,我正在使用Arch Linx。


编辑

那么,我只是想到一个相当肮脏的解决scheme。 Matlab使用环境variables

 LD_LIBRARY_PATH 

对于必要的图书馆的path:

 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 

所以我可以保存这个信息到一个variables(例如MatlabPath ):

 MatlabPath = getenv('LD_LIBRARY_PATH') 

然后在我打电话给搅拌机之前这样做:

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

这使得Matlab使用我的系统库。 然后程序启动后,重新分配旧的值到LD_LIBRARY_PATH:

 setenv('LD_LIBRARY_PATH',MatlabPath) 

所以…这是一个解决scheme,但如果有人知道解决问题的更清洁的方式,让我知道。

正如我在上面的编辑表示,这可能是一个解决方案:

 % 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) 

但是,通过另一种方式启动应用程序,启动后可以立即返回到Matlab:

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

和符号( )是启动应用程序后立即返回Matlab的关键,但以这种方式启动Blender,我无法提供变量FileName,就像我可以用system(…)所做的那样。

所以,任何人都知道如何

  • 使用!program_name与变量文件名

    要么

  • 使用系统(程序名)与一个选项,使Matlab只是启动应用程序(并不等待,直到应用程序已关闭返回)

MATLAB中运行命令:

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

它附加在系统库中的matlab库。

实际上,您可以清除系统调用中的LD_LIBRARY_PATH变量,如下所示:

 system('LD_LIBRARY_PATH=; blender'); 

(请注意,这很可能取决于由MATLAB内部启动的shell的命令语法,上面的内容适用于Bash)。