Capturing incremental output from STDOUT

Discussion in 'Ruby' started by James Coglan, Mar 8, 2010.

  1. James Coglan

    James Coglan Guest

    [Note: parts of this message were removed to make it a legal post.]

    Hi all,

    If I run an external process, e.g.

    IO.popen('cucumber')

    Then Ruby blocks while waiting for the whole output of the subprocess. Is
    there a way to read the subprocess' output incrementally as it is being
    written?


    --
    James Coglan
    http://jcoglan.com
    +44 (0) 7771512510
    James Coglan, Mar 8, 2010
    #1
    1. Advertising

  2. James Coglan wrote:
    > Hi all,
    >
    > If I run an external process, e.g.
    >
    > IO.popen('cucumber')
    >
    > Then Ruby blocks while waiting for the whole output of the subprocess.
    > Is
    > there a way to read the subprocess' output incrementally as it is being
    > written?


    What's almost certainly happening is that the process which is sending
    the output is buffering it, and not flushing the buffer.

    If the subprocess is written in ruby, try adding "$stdout.sync = true"
    at the beginning.

    Some apps will switch into unbuffered mode if they think they are
    talking to a human on a terminal (a tty or pty). There is an
    almost-undocumented 'pty' module in the standard library which you can
    use to run a program under a pty: see

    http://www.ruby-forum.com/topic/133560

    so give that a try if the process you're spawning is not one that you
    can modify.
    --
    Posted via http://www.ruby-forum.com/.
    Brian Candler, Mar 10, 2010
    #2
    1. Advertising

  3. 2010/3/8 James Coglan <>:

    > If I run an external process, e.g.
    >
    > IO.popen('cucumber')
    >
    > Then Ruby blocks while waiting for the whole output of the subprocess.


    IO.popen does not block anything. You would at least have to read
    from or write to the stream in order to get a chance of blocking.

    > Is
    > there a way to read the subprocess' output incrementally as it is being
    > written?


    You can use IO#read(int), i.e. with a size limit, or you can read line
    based. What code do you have and what do you want to accomplish?

    Kind regards

    robert


    --
    remember.guy do |as, often| as.you_can - without end
    http://blog.rubybestpractices.com/
    Robert Klemme, Mar 10, 2010
    #3
  4. Robert Klemme wrote:
    > 2010/3/8 James Coglan <>:
    >
    >> If I run an external process, e.g.
    >>
    >> IO.popen('cucumber')
    >>
    >> Then Ruby blocks while waiting for the whole output of the subprocess.

    >
    > IO.popen does not block anything. You would at least have to read
    > from or write to the stream in order to get a chance of blocking.


    Although the OP didn't mention the platform, as Windows can be broken
    with regards to forking.

    But I just tried it with the one-click installer under XP, and it seems
    to be fine:

    ruby 1.8.6 (2009-08-04 patchlevel 383) [i386-mingw32]

    >> c = IO.popen("pause","w+")

    => #<IO:0x2bea818>
    >> c.readpartial(1024)

    => "Press any key to continue . . . "
    >> c.puts

    => nil
    >> c.readpartial(1024)

    => "\n"
    >> c.readpartial(1024)

    EOFError: end of file reached

    (readpartial reads between 1 and the given number of bytes, depending on
    how many are available at the time)
    --
    Posted via http://www.ruby-forum.com/.
    Brian Candler, Mar 10, 2010
    #4
    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. Moosebumps

    Capturing stdout incrementally

    Moosebumps, Apr 3, 2004, in forum: Python
    Replies:
    5
    Views:
    501
    David Bolen
    Apr 7, 2004
  2. Replies:
    2
    Views:
    338
  3. Luigi
    Replies:
    5
    Views:
    388
    Donn Cave
    Apr 3, 2006
  4. Fuzzyman
    Replies:
    3
    Views:
    617
    Gabriel Genellina
    Jan 7, 2007
  5. Falcolas
    Replies:
    1
    Views:
    230
    Thomas Jollans
    Jun 27, 2007
Loading...

Share This Page