我写了这个,但是没有用...
output = IO.popen("irb", "r+") do |pipe|
pipe.gets
pipe.puts "10**6"
pipe.gets
pipe.puts "quit"
end
我这样改写
IO.popen("irb", "w+") do |pipe|
3.times {puts pipe.gets} # startup noise
pipe.puts "10**6\n"
puts pipe.gets # I expect " => 1000000"
pipe.puts "quit" # I expect exit from irb
end
但它也没有工作
2条答案
按热度按时间7kqas0il1#
一般来说,上面的例子会挂起,因为管道仍然打开写,你调用的命令(ruby解释器)需要更多的命令/数据。
另一个答案将
__END__
发送到ruby --这在这里可以工作,但是这个技巧当然不适用于您可能通过popen
调用的任何其他程序。使用
popen
时,需要使用IO#close_write
关闭管道。参见:Ruby 3.1 popen*
更多详情:
在Ruby中,
IO.popen
、IO.popen2
、IO.popen2e
和IO.popen3
是用于处理子进程的方法,它们在处理输入、输出和错误流方面有所不同。以下是对这些差异的解释以及何时使用它们:*
IO.popen
:IO.popen
是一种通用方法,允许您创建子流程并与其标准输入和输出进行交互。*
IO.popen2
:IO.popen2
创建了一个子流程,该子流程具有用于标准输入和输出的单独管道。*
IO.popen2e
:IO.popen2e
类似于IO.popen2
,但它将标准输出和标准错误流合并为一个流。*
IO.popen3
:IO.popen3
创建了一个子流程,其中包含用于标准输入、标准输出和标准错误的单独管道。何时使用每个版本取决于您的具体要求:
IO.popen
。IO.popen2
。IO.popen2e
。IO.popen3
。r6hnlfcb2#
要么
还是