【发布时间】:2016-06-15 08:38:07
【问题描述】:
在任何两年前版本的 MATLAB 下,我正在寻找 当前脚本正在执行的路径强>(参考1,2,3,4,5),
比方说,对于一个脚本,一般来说,当用户运行一个脚本时:
- “运行”、“运行和前进”、“运行部分”或“运行和时间”菜单按钮,
- 编辑器中的“评估选择”或“评估当前选择”上下文菜单,
- 编辑器中的 F9 或 Ctrl+Enter 键盘快捷键。
解决方案无法接受的用户过程是:
- 直接在命令行中执行一段代码,
- 用于从 Matlab 界面或编辑器 - 文档、浏览器、帮助之外的窗口执行代码的上下文或键盘快捷键。
与功能相关的问题范围之外的用户程序是:
- 从命令行、另一个脚本或函数将脚本作为函数调用。
这不是函数,它可以通过以下任何一种方法轻松完成:
mfilename
mfilename('fullpath')
which(mfilename)
which('mfilename')
S = dbstack('-completenames');S(1).file
[folder,name,ext] = fileparts(which('object'))
这当然和通过以下方式请求当前文件夹不一样:
cd
pwd
【问题讨论】:
-
您能更准确地了解
mfilename的问题吗?它也适用于脚本,至少在 Ubuntu 下使用 R2016a 上的“运行”和类似按钮。 -
我有Matlab R2014b + Windows 8,模式是选择一段代码运行,结果是''。正在手动执行脚本或脚本片段...这是 mfilename 的标准行为。
-
我怀疑您是否会找到“评估选择”模式的解决方案,因为它就像将代码复制并粘贴到命令窗口中。然后代码与任何文件完全无关。
-
没错,但我不是 100% 确定。也许有一个间接的方法,能够请求接口的执行范围。我不会丢弃能够从 matlab 本地提供该信息的 java 程序。
-
当您使用您提到的方法执行代码时,MATLAB 几乎只是复制代码并
eval在基础工作区中将其复制。正如@Ratbert 所说,它不再与特定的.m文件相关,因此不能指望mfilename起作用,并且您不会从dbstack获得有用的范围。我认为 matlabgui 的答案与您将得到的一样接近,但即使这样也很容易失败。