13 second delay using select() with Popen3()

Discussion in 'Python' started by Jonathan Mark, Dec 21, 2006.

  1. hi all...

    I wrote a seemingly simple function (below) to use Popen3() and select()
    to run a program and capture its exit status, stdout output, and stderr
    output.

    It worked fine until the box was upgraded to Debian sarge.
    Now the call to select() always takes about 13 seconds before returning
    the first time.
    The delay only occurs when the function is running within a CGI program
    invoked by Apache (v2.2).
    If I run the same thing from a shell in the same environment, there is
    no delay.
    The correct result is always returned; the only problem is the 13-second
    delay.

    The command passed as "cmd" runs a bash script which looks at some local
    files and prints one line of output and then does "exit 0".
    Python is v2.4.4 (can't use 2.5 because I am using Zope which doesn't
    support it yet).

    I would appreciate any suggestions or advice about whether I got the
    select loop wrong somehow, or what else might be wrong. Thanks!!

    Jonathan Mark
    -------
    import os, popen2, select

    def execCommand(cmd, mergeErrors = False):
    popen3 = popen2.Popen3(cmd, capturestderr = True)
    popen3.tochild.close()

    strOutput = ''
    strErrors = ''
    fdOutputFrom = popen3.fromchild.fileno()
    fdlistFrom = [fdOutputFrom, popen3.childerr.fileno()]
    while fdlistFrom:
    fdlistReadable, fdlistWriteable, fdlistError = select.select(
    fdlistFrom, [], fdlistFrom)
    for fd in fdlistError:
    raise AssertionError('file I/O error with child process')
    for fd in fdlistReadable:
    data = os.read(fd, 8192)
    if data:
    if mergeErrors or fd is fdOutputFrom:
    strOutput += data
    else:
    strErrors += data
    else:
    fdlistFrom.remove(fd)
    popen3.fromchild.close()
    popen3.childerr.close()
    return popen3.wait(), strOutput, strErrors
    Jonathan Mark, Dec 21, 2006
    #1
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    2
    Views:
    2,979
    David Van de Voorde
    Jan 21, 2005
  2. Ruchika
    Replies:
    1
    Views:
    321
    Larry Bates
    Sep 10, 2004
  3. Christopher DeMarco

    Tuning a select() loop for os.popen3()

    Christopher DeMarco, Dec 30, 2005, in forum: Python
    Replies:
    1
    Views:
    488
    Donn Cave
    Dec 31, 2005
  4. yelipolok
    Replies:
    4
    Views:
    244
    John W. Krahn
    Jan 27, 2010
  5. FAQ server
    Replies:
    21
    Views:
    268
    Bart Van der Donck
    Feb 28, 2007
Loading...

Share This Page