这可能太简单了,但我无法在谷歌上找到答案:如何在matlab脚本中获得命令行参数。
我运行matlab作为matlab -nodisplay -r "run('script.m')",我想返回所有的参数作为一个列表。类似于python sys.argv。我该怎么做?
我正在使用Linux和Matlab2015A。
发布于 2015-06-14 16:06:42
我想出了一个在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上),其他字符串是程序参数(如果有的话)。
它的工作原理:
/proc/[PID]/cmdline文件,在Linux上给出任何进程的命令行参数。这些值由空字符\0分隔,因此带有分隔符= char(0)的文本扫描。GetCommandLineA函数是使用MATLAB的愈伤组织调用的。它需要一个头文件。因为我们只想使用一个函数,所以它会在临时文件夹上动态创建头文件,并在不再需要它之后删除它。此外,该函数还注意不要卸载库,以防它已经加载(例如,如果调用脚本已经为其他目的加载了它)。发布于 2015-06-12 14:01:10
我不知道方向解决方案(比如内置的函数)。但是,您可以使用以下解决方案之一:
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的父进程的进程id (即启动MATLAB的shell )传递给wrapper。然后,可以使用它来查找子MATLAB进程及其命令行参数,然后可以在matlab_args中访问这些参数。
2.方法
此方法与OS无关,并不能真正找到命令行参数,但由于您的目标是向脚本传递附加参数,所以它可能对您有用。
创建一个具有以下内容的文件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,然后您可以将其转发到脚本。
https://stackoverflow.com/questions/30802872
复制相似问题