Re: Running an external program inside a Do loop
- To: mathgroup at smc.vnet.net
- Subject: [mg130504] Re: Running an external program inside a Do loop
- From: Peter Pein <petsie at dordos.net>
- Date: Wed, 17 Apr 2013 02:29:41 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-newout@smc.vnet.net
- Delivered-to: mathgroup-newsend@smc.vnet.net
- References: <kk88r9$c1b$1@smc.vnet.net>
Am 12.04.2013 08:16, schrieb Luiz Melo: > Hi > I have to run an external program inside a Do loop, as in the example > below. The .exe program takes the parameter i as input from the > Input.dat file, and generates a two-column numerical .dat file as > output. Next, the Output.dat file has to be imported and manipulated. > Since the external program takes some time to run and the Do loop runs > much faster, the external program is terminating abnormaly. I would > like to know how to tell Mathematica to wait until the external > program finishes its evaluation before to execute the Import command. > Thank you. > Luiz Melo. > > Do [ > Export["Input.dat", i]; > Run["SomeMath.exe"]; > t = Import["Output.dat"]; > tpos[i] = Select[t, #[[1]] > 0 &]; > tneg[i] = Select[t, #[[1]] < 0 &], {i, 100}]; > Hi Luiz, I can not reproduce this behaviour. I wrote a simple program 'SomeMath.c" whichs sleeps three seconds before it writes the output to disk: #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { int number; FILE *ifile = fopen("input.dat", "r"); FILE *ofile = fopen("output.dat", "w"); fscanf(ifile, "%d", &number); fclose(ifile); sleep(3); fprintf(ofile, "%d\n", number*number); fclose(ofile); return(0); } and with SetDirectory[NotebookDirectory[]]; Do[ Export["input.dat", i]; timerr = AbsoluteTiming@Run["SomeMath.exe"]; {t} = Import["output.dat"][[1]]; Print[Grid[{{"Time", "err-code", "input", "output"}, Join[timerr, {i, t}]}]]; , {i, 2} ]; DeleteFile[# <> "put.dat" & /@ {"in", "out"}]; ResetDirectory[]; I get: Time err-code input output 3.095177 0 1 1 Time err-code input output 3.092177 0 2 4 you could try ReadList as in: SetDirectory[NotebookDirectory[]]; Do[ Export["input.dat",i]; Print[First@AbsoluteTiming[ t=First@ReadList["!SomeMath.exe & type output.dat", {Number}] ]]; Print[i,", ",t];, {i,2}]; DeleteFile[(#1<>"put.dat"&)/@{"in","out"}]; ResetDirectory[]; which prints 3.093177 1, {1} 3.082176 2, {4} and has got at least the advantage that these annoying console windows do not appear. This calls SomeMath.exe and types the output to stdout as _one_ command. Maybe this helps in your case. Good luck, Peter