这可能太容易了,但我不能谷歌答案:如何在matlab脚本中获取命令行参数。
我将matlab作为matlab -nodisplay -r "run('script.m')"
运行,我希望将所有参数作为列表返回。与python sys.argv
类似的东西。我怎样才能做到这一点?
我正在使用Linux Mint和MATLAB 2015a。
答案 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
,然后您可以将其转发到您的脚本。