我有一个使用 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) 问题是特定于操作系统的。

为了完整起见,以下是有关我尝试的内容和结果(环境和打印语句)的详细信息:

  • bash 脚本; echo ""
  • 编译的c 代码; printf("\n")
  • python 2.7 脚本; print("".format() )
  • os 内置 ping 程序(如注释中所述)

  • 我在 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/

    10-12 14:51
    查看更多