Forum: Ruby Reading from standard error

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Thiago A. (Guest)
on 2006-03-22 16:34
(Received via mailing list)
Maybe this one has already been answered somewhere. If so, my
searching skills really suck.

How can I start a sub-process from Ruby and read its standard error
and standard output stream separately? I have tried to do it with
IO.popen, but it only reads the output stream. The Process  module
doesn't help either.


Thiago A.
Pierre Barbier de Reuille (Guest)
on 2006-03-22 18:10
(Received via mailing list)
Hi !

I don't know if this is the best way to do it, but here is how I'll do :

rd,wt = IO.pipe # Prepare the pipe to get the output
id = fork do
  # Here we are in the child process
  # First get the system id of the pipe
   # Then launch your process here
   exec("prog", arg1, ...)

# Here you can read the error output from rd
# If you want to wait for the end of the other process first :



PS: I hope this works as I am not on a UNIX machine and fork does not
work :/ However I tried the IO.reopen part and this works fine.

Thiago A. a écrit :
Joel VanderWerf (Guest)
on 2006-03-22 19:55
(Received via mailing list)
Thiago A. wrote:
> Thiago A.
require 'open3'

stdin, stdout, stderr = Open3.popen3(
  'ruby -e "\$stdout.sync = true; while (s=gets); 5.times
{\$stderr.puts(s.reverse); puts s}; end"')

t1 = do
  while (s=stderr.gets)
    puts "STDERR: #{s.inspect}"
  puts "STDERR: DONE"

t2 = do
  while (s=stdout.gets)
    puts "STDOUT: #{s.inspect}"
  puts "STDOUT: DONE"

stdin.puts "foo"
[t1, t2].each do |t| t.join end

The purpose of the $stdout.sync = true in the subprocess is so that you
can read the subprocess's stdout as soon as it is written to. If all you
care about is getting all the stdout _eventually_, you don't need it.
This topic is locked and can not be replied to.