在运行时为Mac和Linux获取已部署的Matlab应用程序的位置

ack*_*use 9 matlab matlab-deployment

我有一些独立的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
Run Code Online (Sandbox Code Playgroud)

为了得到它为Linux和Mac工作,我想我可以代替system('path')使用system('echo $PATH'),并改变正则表达式,以适应Unix的语法,但不像在Windows似乎当前正在运行的可执行文件的目录不被自动添加到路径的前变量.在Matlab中是否有一种方法可以获取当前正在运行的可执行文件的目录(我知道有脚本,但在部署时似乎没有正常工作),或者我应该在运行之前编辑设置MCR的脚本应用程序设置我的代码可以用system命令读取的变量?

具体而言,用户计算机上的某个位置是文件夹EXECFOLDER,结构如下:

EXECFOLDER
| exec1
| exec2
| run_exec1.sh
| run_exec2.sh
| data.xml
Run Code Online (Sandbox Code Playgroud)

我想弄清楚EXECFOLDER无论用户在哪里运行的路径run_exec1.sh(设置MCR和调用的脚本exec1),以便exec1可以读取data.xml和执行exec2.

尝试摘要:

  • system('echo $PATH'):可执行目录不在Mac和Linux的路径上
  • matlabroot:MCR的位置
  • pwd:用户的当前文件夹,当它以完整路径运行时,可能与可执行文件的位置不同
  • dbstack:未打包的.m文件的位置
  • which:未打包的.m文件的位置
  • fileattrib:未打包的.m文件的位置

Jan*_*nus 2

这方面有什么进展吗?

您需要做的(对于两个平台)是访问 shell 传递给可执行文件的第 0 个参数。执行此操作的一种方法是将对可执行文件的调用包装在脚本中并显式传递位置:

myapp.bat:

set scriptpath=%~d0%~p0
"%scriptpath%%~n0%.exe" --ExecutablePath="%scriptpath%" %*
Run Code Online (Sandbox Code Playgroud)

或者,如果您不希望 CMD 窗口保留在周围

myapp.bat:

set scriptpath=%~d0%~p0
start "%~n0" "%scriptpath%%~n0%.exe" --ExecutablePath="%scriptpath%" %*
Run Code Online (Sandbox Code Playgroud)

Bash 实际上更难(参见这个问题),但是这样的方法可能会起作用:

myapp.sh

#!/bin/bash
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
"${SCRIPTPATH}/myapp.o" --ExecutablePath="${SCRIPTPATH}" $*
Run Code Online (Sandbox Code Playgroud)