On 26.02.2017 17:36, Petter Gustad wrote:
It seems like stdin must be closed for popen3 to send stdin to the sub-process. How can I do something like this:
require 'open3'
stdin, stdout, stderr, wait_thr = Open3.popen3("dc")
stdin.puts "1 2 + p"
stdin.flush # does not not help
stdin.close # without this it will just hang on the read
res = stdout.read
puts "1+2 is #{res}"
#stdin.reopen # is it possible to re-open the stdin somehow?
stdin.puts "#{res} 2 * p"
stdin.close
res = stdout.read
puts "(1+2)*2 is #{res}"
...
Is there a way to flush or re-open stdin? Is there some other variation
of popen3 which can be used?
You are missing one important point: stdout.read must block until dc
closes its output because there is no limit set on the read amount. And
that will only happen if dc's input has been closed because, obviously,
dc needs to be able to write results as long as input is coming. If you replace that line with
res = stdout.gets
it will work the way you expect. You could also use stdout.sync=true to
avoid to have to use #flush all the time.
http://ruby-doc.org/core-2.4.0/IO.html#method-i-sync-3D
Kind regards
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)