У меня есть несколько автономных программ Matlab, которым по разным причинам необходим доступ к файлам в каталоге, в котором они находятся (либо для запуска другой программы, либо для чтения там некоторых XML-файлов). У меня есть следующая функция, которая работает в Windows:
function execDir = get_deployed_exec_dir()
% Returns the directory of the currently running executable, if deployed,
% an empty string if not deployed (or if unable to determine the directory)
execDir = '';
if isdeployed
[status, execDir] = system('path');
if status == 0
execDir = char(regexpi(execDir, 'Path=(.*?);', 'tokens', 'once'));
end
end
Чтобы заставить его работать для Linux и Mac, я решил, что могу заменить system('path')
на system('echo $PATH')
и изменить регулярное выражение, чтобы оно соответствовало синтаксису Unix, но, в отличие от Windows, каталог текущего исполняемого файла, похоже, не добавляется автоматически в начало переменная пути. Есть ли способ в Matlab получить каталог исполняемого в данный момент исполняемого файла (я знаю, что он есть для сценария, но, похоже, он не работает должным образом при развертывании), или мне следует отредактировать сценарий, который устанавливает MCR перед запуском приложение для установки переменной, которую мой код может прочитать с помощью команды system
?
Для конкретности где-то на компьютере пользователя находится папка EXECFOLDER
, имеющая структуру:
EXECFOLDER
| exec1
| exec2
| run_exec1.sh
| run_exec2.sh
| data.xml
Я хочу выяснить путь к EXECFOLDER
независимо от того, где пользователь запускает run_exec1.sh
(сценарий, который устанавливает MCR и вызывает exec1
), чтобы exec1
мог читать из data.xml
и выполнять exec2
.
Резюме попыток:
system('echo $PATH')
: исполняемый каталог не находится на пути в Mac и Linuxmatlabroot
: расположение MCRpwd
: текущая папка пользователя, которая может отличаться от расположения исполняемого файла, когда он запускается с полным путемdbstack
: расположение распакованного файла .mwhich
: расположение распакованного файла .mfileattrib
: расположение распакованного файла .m
matlabroot
? А в каком состоянииpwd
при запуске программы? Конечно, есть команды * NIXwhich
иwhereis
, но они кажутся деспотичными. - person horchler   schedule 26.07.2013matlabroot
указывает местоположение используемого MCR.pwd
дает вам местоположение, в котором находится пользователь в терминале (где они вызвали приложение), но для нашей программы люди, как правило, переходят туда, где находятся их данные, и вызывают программу, используя ее полный путь, поэтому, где на самом деле исполняемые файлы находятся, другое из текущего каталога пользователя. Мне было интересно, есть ли в Matlab способ получить эту информацию без необходимости настраивать переменную среды в сценарии Bash, который вы используете для запуска программы. - person ackrause   schedule 26.07.2013stack = dbstack('-completenames')
fullpath = stack.Name
, чтобы получить полный путь к текущей запущенной программе? Также можно попробоватьwhich
(с флагом'-all'
) или возможноfileattrib
. - person horchler   schedule 26.07.2013dbstack
,which
иfileattrib
все, кажется, дают мне место, где.m
файлы распаковываются для запуска MCR, а не их исходное местоположение в исполняемом файле. Я начинаю думать, что это может быть так же хорошо, как и в самом коде Matlab, благодаря тому, как он работает. - person ackrause   schedule 27.07.2013system
иunix
, поэтому вам может потребоваться найти там решение (например,which
,whereis
и, возможно, даже какая-то формаps
). Вы задавали этот вопрос на MatlabCentral? Это похоже на то, что нужно уметь получить. - person horchler   schedule 27.07.2013lsof
в OS X и некоторые другие формы UNIX и/proc/<PID>/
в Linux, которые могут быть полезны. - person horchler   schedule 27.07.2013