在计算过程中是否可以暂停Mathematica内核?这是一个例子。
Module[{},
Mathematica code....
..........
..........
{
Calls an external program with some argument
Needs to wait for an external program to create a file (* How ?*)
}
Mathematica code using that file content....
...........
...........
]
我可以提出一个Do[..]
循环解决方案,该解决方案继续检查指定目录中是否创建了文件。一旦找到文件,它就会读取内容,Mathematica代码的其余部分会处理数据。
有没有优雅的方法来解决这个问题?
BR
答案 0 :(得分:12)
尝试Pause[n]
,暂停至少n秒。
编辑:要使其在不确定的时间内工作,您需要重复轮询文件系统。 FileExistsQ
执行此操作,您可以像
While[!FileExistsQ[ "filename" ], Pause[1]]
在等待时最多只有一秒的浪费时间。
进一步编辑:您还可以将文件存在轮询放在批处理文件中,从而释放您的Mathematica会话。例如。制作一个名为C:\ Temp \ Test.bat的批处理文件,其中包含:
@echo off
start /min apame_win64 input
echo Loop commenced %TIME%
:loop
rem wait three seconds
ping localhost -n 3 > nul
if not exist c:\temp\alldone.txt goto loop
rem wait while file is completely written out
ping localhost -n 3 > nul
rem then terminate the process
taskkill /f /fi "imagename eq apame_win64.exe"
exit
从Mathematica调用它:Run["start /min c:\\temp\\test.bat"]
此批量演示假设apame_win64将写出文件alldone.txt以完成。
答案 1 :(得分:6)
您调用外部程序,创建文件后该程序是否退出?如果是这样,那么RunThrough就是你要找的,请参阅RunThrough example。在那里,他们使用Mathematica的另一个实例作为外部程序(比如执行Mathematica脚本并等待其结果)。
如果在创建文件后外部程序必须继续运行,那么您可以使用单独的脚本(shell脚本,python,ruby ...)来检查文件是否存在。