5

我正在通过subprocess模块将一个小的 MATLAB 脚本与 Python 连接起来。如下:

cmd='(matlab -nosplash -nodesktop -r "optimizer;quit;")'
p = subprocess.Popen(cmd,stdin=None,stdout=None,shell=True)
#subprocess.Popen.wait(p)
#p.wait()
print "DONE?"

但是甚至在 MATLAB 启动之前就已经打印了“DONE”!因此,我过去的整个代码都被破坏了。

我努力了:

  • 使用 os.system() 调用(这是我开始的地方,但我在 SO 上读到它已弃用)
  • 使用p.wait()subprocess.Popen.wait。两者都不起作用。
  • 使用 3 分钟的手动暂停(MATLAB 平均完成所需的最长时间)Super Sloppy

我错过了什么?

4

3 回答 3

5

对我来说很好:

import subprocess
retcode = subprocess.call(["matlab", "-nosplash", "-nodesktop", "-r", "quit;"])
print "DONE", retcode

相应地拆分命令参数,仅使用您实际需要的选项(shell=True例如,不需要),使用直接执行您之后的操作的函数(call),即调用并等待完成。

根据您的安装(参见http://www.mathworks.com/help/matlab/ref/matlabwindows.html),Matlab可能会以一种立即退出的方式启动。要处理这个问题,请将“-wait”添加到您的参数列表中。

于 2012-12-19T19:50:56.077 回答
5

使用“-wait”标志启动 Matlab。从文档中:

“MATLAB 由一个单独的启动程序启动,该启动程序通常启动 MATLAB,然后立即退出。使用此选项告诉启动程序在 MATLAB 终止之前不要退出。当您需要在脚本中处理来自 MATLAB 的结果时,此选项很有用。使用此选项调用 MATLAB 会阻止脚本继续执行,直到生成结果为止。”

于 2013-06-12T16:12:57.657 回答
0

根据您对我的评论的回复,让我用我为我的应用程序所做的事情来回答您的问题,这与您的过程相似(尽管在 C# 中)。与其试图强迫您的进程等待 MATLAB 完成(这显然现在不起作用),不如等待该 CSV 文件被写入。如果您担心可能有重复,那么只需将当前日期和时间附加到文件末尾,这应该可以解决问题。

于 2012-12-19T19:55:28.037 回答