Catching subprocess stdout stream

T

Thomas Jansson

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
 
S

Sean DiZazzo

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
 
F

Fredrik Lundh

Sean said:
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...

and unless you add a call to time.sleep somewhere in that loop, you'll
keep your CPU up all night as well...

</F>
 
M

Michele Simionato

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?

Sometimes very low technology solutions may be enough. For instance on
Unix
you could call os.system on something like that:

xterm -e "the-fortran-executable|less"

Make sure the Fortran executable output is unbuffered.

Michele Simionato
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,904
Latest member
HealthyVisionsCBDPrice

Latest Threads

Top