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