在matlab中获取命令行参数

时间:2015-06-12 12:17:27

标签: matlab command-line

这可能太容易了,但我不能谷歌答案:如何在matlab脚本中获取命令行参数。

我将matlab作为matlab -nodisplay -r "run('script.m')"运行,我希望将所有参数作为列表返回。与python sys.argv类似的东西。我怎样才能做到这一点?

我正在使用Linux Mint和MATLAB 2015a。

2 个答案:

答案 0 :(得分:4)

我提出了一个适用于Windows和Linux(Ubuntu)的简单功能:

function args = GetCommandLineArgs()

if isunix
    fid = fopen(['/proc/' num2str(feature('getpid')) '/cmdline'], 'r');
    args = textscan(fid, '%s', 'Delimiter', char(0));
    fclose(fid);
else
    kernel32WasAlreadyLoaded = libisloaded('kernel32');
    if ~kernel32WasAlreadyLoaded
        temporaryHeaderName = [gettempfolder '\GetCommandLineA.h'];
        dlmwrite(temporaryHeaderName, 'char* __stdcall GetCommandLineA(void);', '');
        loadlibrary('kernel32', temporaryHeaderName);
        delete(temporaryHeaderName);
    end
    args = textscan(calllib('kernel32', 'GetCommandLineA'), '%q');
    if ~kernel32WasAlreadyLoaded
        unloadlibrary kernel32;
    end
end

args = args{1};

在您的示例通话中,它会返回:

>> GetCommandLineArgs

args = 

    '/[path-to-matlab-home-folder]/'
    '-nodisplay'
    '-r'
    'run('script.m')'

它返回一个字符串的单元格数组,其中第一个字符串是MATLAB主文件夹的路径(在Linux上)或MATLAB可执行文件的完整路径(在Windows上),其他是程序参数(如果有的话)。 / p>

工作原理:

  • 在Linux上:该函数使用feature函数获取当前的Matlab进程ID(请注意它是未记录的功能)。并读取/proc/[PID]/cmdline文件,on Linux给出任何进程的命令行参数。值由空字符\0分隔,因此带有分隔符的textscan = char(0)。

  • 在Windows上:函数调用GetCommandLineA,它返回字符串上的命令行参数。然后它使用textscan来分割各个字符串的参数。使用MATLAB' calllib调用GetCommandLineA函数。它需要一个头文件。由于我们只想使用一个函数,它会在临时文件夹上动态创建头文件,并在不再需要它之后将其删除。此函数还注意不要在已经加载库的情况下卸载库(例如,如果调用脚本已经将其加载用于其他目的)。

答案 1 :(得分:3)

我不知道方向解决方案(如内置函数)。 但是,您可以使用以下解决方法之一:

<强> 1。方法

这仅适用于Linux:

使用以下内容创建文件pid_wrapper.m

function [] = pid_wrapper( parent_pid )

[~, matlab_pid] = system(['pgrep -P' num2str(parent_pid)]);
matlab_pid = strtrim(matlab_pid);
[~, matlab_args] = system(['ps -h -ocommand ' num2str(matlab_pid)]);
matlab_args = strsplit(strtrim(matlab_args));
disp(matlab_args);

% call your script with the extracted arguments in matlab_args
% ...

end

像这样调用MATLAB:

matlab -nodisplay -r "pid_wrapper($$)"

这会将MATLAB的父进程(即启动MATLAB的shell)的进程ID传递给wrapper。然后,可以使用它来查找子MATLAB进程及其命令行参数,然后可以在matlab_args中访问它们。

<强> 2。方法

此方法与操作系统无关,并不能真正找到命令行参数,但由于您的目标是将其他参数传递给脚本,因此它可能适合您。

使用以下内容创建文件vararg_wrapper.m

function [] = wrapper( varargin )

% all parameters can be accessed in varargin
for i=1:nargin
    disp(varargin{i});
end

% call your script with the supplied parameters 
% ...

end

像这样调用MATLAB:

matlab -nodisplay -r "vararg_wrapper('first_param', 'second_param')"

这会将{'first_param', 'second_param'}传递给vararg_wrapper,然后您可以将其转发到您的脚本。