我正在寻找一种方法来从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)。