以编程方式确定脚本是否正常发布或执行
Programmatically determine if a script is being published or executed normally
在发布 R2016a 之前,publishing 是 MATLAB 中 记录脚本结果的方式。我发现当我手动 运行 脚本时,我经常在整个脚本中放置 pause
命令。有没有一种简单的方法可以确定脚本是否已发布?然后,我可以用一些代码来包装我的暂停:
if isNotPublishing
pause();
end
我的 google foo 未能找到解决方案。
一个简单的方法是查看 publish
是否在调用堆栈中。 dbstack
将 return 一个 struct
的数组,指示以何种顺序调用哪些函数以到达我们调用 dbstack
的点。我们可以使用 name
属性 来告诉我们所有这些函数的名称,并查看 publish
是否在其中。如果是,那么我们假设脚本是通过 publish
.
调用的
stack = dbstack;
isBeingPublished = ismember('publish', {stack.name});
或者,如果您希望它是单行的
isBeingPublished = ismember('publish', cellfun(@(x)x.name, dbstack, 'UniformOutput', 0));
无论您是使用 Publish 工具栏还是使用
从命令行发布脚本,这都应该有效
publish('myscript.m')
如果你想变得非常花哨,你可以重载 pause
(或编写你自己的版本,mypause
)来为你执行此检查。这是有效的,因为在您的新 pause
函数中,dbstack
仍将包含 publish
,因为您从最终由 publish
评估的脚本中调用它。如果您创建此函数,那么您的代码中就不需要所有这些逻辑,只需调用 mypause()
即可。
function mypause(varargin)
stack = dbstack;
if ~ismember('publish', {stack.name});
builtin('pause', varargin{:})
end
end
在发布 R2016a 之前,publishing 是 MATLAB 中 记录脚本结果的方式。我发现当我手动 运行 脚本时,我经常在整个脚本中放置 pause
命令。有没有一种简单的方法可以确定脚本是否已发布?然后,我可以用一些代码来包装我的暂停:
if isNotPublishing
pause();
end
我的 google foo 未能找到解决方案。
一个简单的方法是查看 publish
是否在调用堆栈中。 dbstack
将 return 一个 struct
的数组,指示以何种顺序调用哪些函数以到达我们调用 dbstack
的点。我们可以使用 name
属性 来告诉我们所有这些函数的名称,并查看 publish
是否在其中。如果是,那么我们假设脚本是通过 publish
.
stack = dbstack;
isBeingPublished = ismember('publish', {stack.name});
或者,如果您希望它是单行的
isBeingPublished = ismember('publish', cellfun(@(x)x.name, dbstack, 'UniformOutput', 0));
无论您是使用 Publish 工具栏还是使用
从命令行发布脚本,这都应该有效publish('myscript.m')
如果你想变得非常花哨,你可以重载 pause
(或编写你自己的版本,mypause
)来为你执行此检查。这是有效的,因为在您的新 pause
函数中,dbstack
仍将包含 publish
,因为您从最终由 publish
评估的脚本中调用它。如果您创建此函数,那么您的代码中就不需要所有这些逻辑,只需调用 mypause()
即可。
function mypause(varargin)
stack = dbstack;
if ~ismember('publish', {stack.name});
builtin('pause', varargin{:})
end
end