Catching subprocess stdout stream

Sean DiZazzo half.italian at gmail.com
Wed Sep 10 06:55:53 EDT 2008


On Sep 8, 8:37 am, Thomas Jansson <tjansso... at gmail.com> 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



More information about the Python-list mailing list