10

さまざまな理由で、配置されているディレクトリ内のファイルにアクセスする必要があるスタンドアロンの 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 で動作させるには、Unix 構文に合わせて正規表現を置き換えsystem('path')system('echo $PATH')変更できると考えましたが、Windows とは異なり、現在実行中の実行可能ファイルのディレクトリがパスの先頭に自動的に追加されないようです。変数。Matlab 内で現在実行中の実行可能ファイルのディレクトリを取得する方法はありますか (スクリプト用のものがあることは知っていますが、展開すると正しく動作しないようです)、または実行前に MCR を設定するスクリプトを編集する必要があります私のコードがsystemコマンドで読み取ることができる変数を設定するアプリケーション?

具体的には、ユーザーのコンピューターのどこかにフォルダーEXECFOLDERがあり、構造は次のとおりです。

EXECFOLDER
| exec1
| exec2
| run_exec1.sh
| run_exec2.sh
| data.xml

EXECFOLDERユーザーが実行している場所run_exec1.sh(MCR を設定して を呼び出すスクリプト) に関係なく、 へのパスを把握して、から読み取って実行できるexec1ようにしたいと考えています。exec1data.xmlexec2

試行の概要:

  • system('echo $PATH'): 実行可能ディレクトリが Mac および Linux のパス上にありません
  • matlabroot: MCRの場所
  • pwd: ユーザーの現在のフォルダー。フル パスで実行した場合、実行可能ファイルの場所とは異なる場合があります。
  • dbstack: パッケージ化されていない .m ファイルの場所
  • which: パッケージ化されていない .m ファイルの場所
  • fileattrib: パッケージ化されていない .m ファイルの場所
4

4 に答える 4

4

関数は必要な機能を備えctfrootていますか?

ctfrootは MATLAB Compiler からのコマンドです。ドキュメントから:

root = ctfrootデプロイされたアプリケーションのデプロイ可能なアーカイブが展開されるフォルダーの名前である文字列を返します。

おそらく、ブロックctfroot内でのみコマンドを使用したいでしょう。if isdeployed

編集

展開先の場所ではなく、実行可能ファイルの場所が必要な場合は、次の関数を使用できます。

function currentDir = getcurrentdir
if isdeployed % Stand-alone mode.
    [status, result] = system('path');
    currentDir = char(regexpi(result, 'Path=(.*?);', 'tokens', 'once'));
else % MATLAB mode.
    currentDir = pwd;
end

これは、実行可能ファイルへのパスが、実行時に実行可能ファイルによって最初のエントリとして PATH 変数に追加されるため機能します。

または、同様のジョブを実行する MEX ファイルを作成することもできます。詳細と MEX ファイルの例については、この MathWorks サポートの回答を参照してください。

于 2015-01-15T14:05:22.750 に答える