FAQ
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"),bufsize24,shellúlse,
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

Search Discussions

  • Sean DiZazzo at Sep 10, 2008 at 10:55 am

    On Sep 8, 8:37?am, Thomas Jansson 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"),bufsize24,shellúlse,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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"),bufsize24,shellúlse,
    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
  • Fredrik Lundh at Sep 10, 2008 at 11:13 am

    Sean DiZazzo wrote:

    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>
  • Michele Simionato at Sep 10, 2008 at 12:21 pm

    On Sep 8, 5:37?pm, Thomas Jansson 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?
    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

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppython-list @
categoriespython
postedSep 8, '08 at 3:37p
activeSep 10, '08 at 12:21p
posts4
users4
websitepython.org

People

Translate

site design / logo © 2023 Grokbase