On Sep 8, 8:37 am, Thomas Jansson <[EMAIL PROTECTED]> wrote: > Dear all > > I have tkinkter based frontend to a Fortran based program. I use > subprocess to launch the fortran program as a child process and I wish > to see the output of the fortran program as it is created in the > console. > > The fortran program can take up to 20 minuttes to finish and at the > moment the I will first see any output after the fortran program is > done. How make my function write the output of the process as it > comes? > > def runprogram(Icommand, Ijobfile, Ioutput): > if os.name == "posix": > os.system(pythonpath+"/bin/"+Icommand+"< "+Ijobfile+" | tee > "+Ioutput) > elif os.name == "nt": > import subprocess > ofile = open(Ioutput, 'w') > p = subprocess.Popen([os.path.join(pythonpath, "bin", Icommand > + '.exe')], > stdin=open(Ijobfile, > "rb"),bufsize=1024,shell=False, > stdout=subprocess.PIPE) > > while p.poll() is None: #Check if child process has terminated. > o = p.stdout.readline() > ofile.writelines(o) > print o, > ofile.close > > Kind regards > Thomas Jansson
import threading, Queue, subprocess class iCommand(threading.Thread): def __init__ (self, iCommand, iJobFile, queue): threading.Thread.__init__(self) self.iCommand = iCommand self.queue = queue self.iJobFile = iJobFile def run(self): p = subprocess.Popen([os.path.join("C:/Python25", "bin", self.iCommand + '.exe')], stdin=open(self.iJobFile, "rb"),bufsize=1024,shell=False, stdout=subprocess.PIPE) while p.poll() == None: q.put(p.stdout.readline()) command = "FOO" jobFile = ="FAH" aQueue = Queue.Queue() fo = open("C:/temp/foo.out", 'w') aThread = iCommand(command, jobFile, aQueue) aThread.start() while aThread.isAlive() or not aQueue.empty(): l = aQueue.get().rstrip() fo.write(l) print l fo.close() A bit of fun for a sleepless night... ~Sean -- http://mail.python.org/mailman/listinfo/python-list