我有一个使用 system()
命令调用可执行文件(用 C++ 编写)的 MATLAB 脚本,如下所示:
exe_status = system('MySimulation.exe', arguments);
由于可执行文件可能需要很长时间才能运行(最多几个小时),我在其中包含了一个函数,用于估计剩余时间并将其输出到控制台。如果我在 MATLAB 之外运行可执行文件,Windows 控制台大致如下所示:
Simulation #B01 initiated...
Completion: 0.57% Time remaining: 183 m 2 s
使用
\r
字符,“完成”行每秒重写一次。这非常有效,让我知道什么时候回来分析数据。不幸的是,从 MATLAB 控制台调用可执行文件并没有相同的效果。 MATLAB 会等到可执行文件终止,然后才显示任何控制台输出,从而使我的计时器没有实际意义。
我尝试了以下命令,但它们都有相同的行为:
exe_status = system('MySimulation.exe', arguments);
exe_status = system('MySimulation.exe', arguments, '-echo');
exe_status = dos('MySimulation.exe', arguments);
exe_status = dos('MySimulation.exe', arguments, '-echo');
除非我读错了,MATLAB documentation 似乎表明
'-echo'
可用于在可执行文件仍在运行时回显命令输出,但它对我的特定程序没有影响。 最佳答案
我很好奇所以我尝试了一些东西。我尝试了一个 bash 脚本、一个 c 可执行文件和一个 python 脚本,它们都“实时”地在 Matlab 命令窗口中显示它们的输出,这是该问题所需的行为。我无法重新创建问题中描述的情况。
所以我怀疑:
a) 无论您使用什么方法叠印同一行都是问题所在。这可能不是 \r
的使用,它可能与您在 C++ 可执行文件中使用的特定打印方法有关。我会尽量不使用叠印,而是使用您能想到的最简单的打印语句在新行上打印状态。
或者,
b) 问题是特定于操作系统的。
为了完整起见,以下是有关我尝试的内容和结果(环境和打印语句)的详细信息:
echo ""
printf("\n")
print("".format() )
我在 Matlab 中运行它,使用
system
命令,例如 system('./timer_out');
。在所有情况下:- 如果没有第二个输出变量,无论使用 '-echo' 标志或尾随分号,打印输出都会“实时”出现,例如:
tic; system('./timer_out'); toc
- 如果给出了输出变量,则打印输出被抑制,例如:
tic; [s,r]=system('./timer_out'); toc
- 如果给出了输出变量并使用了“-echo”标志,则打印输出会实时出现,例如:
tic; [s,r]=system('./timer_out','-echo'); toc
此行为符合文档。这些测试在 OS X 上使用 Matlab R2015b。
关于c++ - 如何让 MATLAB 的 system() 或 dos() 实时显示控制台输出?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38362089/