首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在matlab中获取命令行参数

在matlab中获取命令行参数
EN

Stack Overflow用户
提问于 2015-06-12 12:17:26
回答 2查看 3.2K关注 0票数 7

这可能太简单了,但我无法在谷歌上找到答案:如何在matlab脚本中获得命令行参数。

我运行matlab作为matlab -nodisplay -r "run('script.m')",我想返回所有的参数作为一个列表。类似于python sys.argv。我该怎么做?

我正在使用Linux和Matlab2015A。

EN

回答 2

Stack Overflow用户

发布于 2015-06-14 16:06:42

我想出了一个在Windows和Linux (Ubuntu)上都能工作的简单函数:

代码语言:javascript
复制
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};

在您的示例调用中,它将返回以下内容:

代码语言:javascript
复制
>> GetCommandLineArgs

args = 

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

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

它的工作原理:

  • Linux上的函数使用功能函数获得当前的功能进程ID (请注意,这是一个没有文档的特性)。并读取/proc/[PID]/cmdline文件,在Linux上给出任何进程的命令行参数。这些值由空字符\0分隔,因此带有分隔符= char(0)的文本扫描
  • Windows上的函数调用GetCommandLineA,后者返回字符串上的命令行参数。然后,它使用文本扫描来拆分单个字符串上的参数。GetCommandLineA函数是使用MATLAB的愈伤组织调用的。它需要一个头文件。因为我们只想使用一个函数,所以它会在临时文件夹上动态创建头文件,并在不再需要它之后删除它。此外,该函数还注意不要卸载库,以防它已经加载(例如,如果调用脚本已经为其他目的加载了它)。
票数 4
EN

Stack Overflow用户

发布于 2015-06-12 14:01:10

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

1.方法

这只适用于Linux:

创建一个具有以下内容的文件pid_wrapper.m

代码语言:javascript
复制
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:

代码语言:javascript
复制
matlab -nodisplay -r "pid_wrapper($$)"

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

2.方法

此方法与OS无关,并不能真正找到命令行参数,但由于您的目标是向脚本传递附加参数,所以它可能对您有用。

创建一个具有以下内容的文件vararg_wrapper.m

代码语言:javascript
复制
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:

代码语言:javascript
复制
matlab -nodisplay -r "vararg_wrapper('first_param', 'second_param')"

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30802872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档