Имам някои самостоятелни програми на 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
: местоположение на неопакования .m файлwhich
: местоположение на неопакования .m файлfileattrib
: местоположение на неопакования .m файл
matlabroot
? И какво е състоянието наpwd
, когато програмата се стартира? Разбира се, има *NIX командиwhich
и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