Запустить приложение из Matlab - PullRequest
10 голосов
/ 01 декабря 2011

Я ищу способ запустить приложение из Matlab.Дело в том, что мой скрипт Matlab сохраняет некоторые результаты в файл, который затем должен быть открыт в соответствующем приложении (в данном случае Blender).

Я знаком с такими командами, как

system('program_name')

или

!program_name

и некоторые другие способы, но дело в том, что приложение запускается с помощью PATL в Matlab, поэтому оно ищет в каталоге 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, с некоторыми аргументами (имя файла Blender.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Между прочим.


Edit :

Ну, я просто подумал о довольно грязном решении.Matlab использует переменную окружения

LD_LIBRARY_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

Поэтому я могу сохранить эту информацию в переменной (например, MatlabPath ):

MatlabPath = getenv('LD_LIBRARY_PATH')

и затем, прежде чем я вызову blender, сделайте следующее:

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

Что заставляет Matlab использовать мои системные библиотеки.Затем после запуска программы переназначьте старое значение в LD_LIBRARY_PATH:

setenv('LD_LIBRARY_PATH',MatlabPath)

Итак ... это решение, но если кто-нибудь знает более чистый способ решения проблемы, дайте мне знать.

Ответы [ 3 ]

3 голосов
/ 03 декабря 2011

Как я указывал в моем редакторе выше, это может быть решением:

% 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 (имя_программы) с такой опцией, что Matlab просто запускает приложение (и не ожидает возврата, пока приложение не будет закрыто)

0 голосов
/ 20 февраля 2015

Вы можете на самом деле очистить переменную LD_LIBRARY_PATH в системном вызове, например:

system('LD_LIBRARY_PATH=; blender');

(обратите внимание, что это, скорее всего, зависит от синтаксиса команд оболочки, которая была запущена внутри MATLAB. Вышеуказанное должно работать для Bash).

0 голосов
/ 06 октября 2014

Просто запустите команду в MATLAB :

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

Добавляет библиотеку matlab в системную библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...