Asychronous execution *with* return codes?

Discussion in 'Python' started by utabintarbo, Oct 5, 2006.

  1. utabintarbo

    utabintarbo Guest

    I hope I have not overlooked a solution already posted, but I seem to
    be unable to suss out a way to achieve both multiple console-less
    executions of a given (console) application and gathering the return
    code from the application.

    What I have found:
    import subprocess

    # gives back return code, but does not run asynchronously
    retcode =[app, lstArgs])
    retcode = subprocess.Popen([app] + lstArgs).wait()
    # runs the app async, but only returns the pid (no return code)
    pid = subprocess.Popen([app] + lstArgs).pid

    Is there some magic elixir which will get me both?

    utabintarbo, Oct 5, 2006
    1. Advertisements

  2. utabintarbo

    MonkeeSage Guest

    Check out the poll() method and the returncode attribute:

    MonkeeSage, Oct 5, 2006
    1. Advertisements

  3. utabintarbo

    utabintarbo Guest

    Thanks for the reply.

    If I understand your meaning, I should do something like this (given I
    wish to run an app against several arguments [my use case]):

    for lstArgs in pileOflstArgs:
    uniqueProcessID = subprocess.Popen([app] + lstArgs)
    pid =
    retcode = uniqueProcessID.poll()
    # increment uniqueProcessID

    If so, how do I handle the poll() on long-running processes? Run a
    bunch and then start a check loop? Am I asking too many questions?
    utabintarbo, Oct 5, 2006
  4. utabintarbo

    Justin Guest

    If you're on a POSIX system, you could use the usual fork/exec/wait:

    import os
    for lstArgs in pileOflstArgs:
    pid = os.fork()
    if not pid:
    os.execv( app, lstArgs )

    for i in range(len(pileOflstArgs)):
    pid, status = os.wait()

    Of couse, os.wait() will block until a child exits. Look at the docs
    for the status code it returns, though, as it's not just the return
    value of the process.

    Justin, Oct 5, 2006
  5. utabintarbo

    utabintarbo Guest

    Sorry. Win32. We are only allowed spoons - no sharp objects. :p
    utabintarbo, Oct 5, 2006
  6. Use the async way, and then, os.waitpid()

    Gabriel Genellina
    Softlab SRL

    Preguntá. Respondé. Descubrí.
    Todo lo que querías saber, y lo que ni imaginabas,
    está en Yahoo! Respuestas (Beta).
    ¡Probalo ya!
    Gabriel Genellina, Oct 5, 2006
  7. How about installing Cygwin, then, and running under that?
    Lawrence D'Oliveiro, Oct 9, 2006
  8. or use a thread to keep track of each external process.

    Fredrik Lundh, Oct 9, 2006
  9. utabintarbo

    utabintarbo Guest

    This sounds most promising. Might you have a code snippet (or link to
    same) illustrating this?
    utabintarbo, Oct 11, 2006
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.