Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阅读另一个程序';是Ruby程序中的标准输出吗?_Ruby_Io_Stdout_Stdin_Popen - Fatal编程技术网

如何阅读另一个程序';是Ruby程序中的标准输出吗?

如何阅读另一个程序';是Ruby程序中的标准输出吗?,ruby,io,stdout,stdin,popen,Ruby,Io,Stdout,Stdin,Popen,我有一个名为“count”的小型测试Ruby程序,它的计数为1..50 #!/usr/bin/ruby #count for i in 1..50 do STDOUT.puts i sleep 1 end 我想从另一个程序调用它,逐行读取输出的数字,然后逐行从另一个程序输出 但是,我的构造不起作用: IO.popen("count","r+") {|f| puts f.readline} 我该怎么做才能让它工作?可能对测试程序“count”进行了一些修改?如果您有耐心(大约50秒的时间)

我有一个名为“count”的小型测试Ruby程序,它的计数为1..50

#!/usr/bin/ruby
#count
for i in 1..50 do
 STDOUT.puts i
 sleep 1
end
我想从另一个程序调用它,逐行读取输出的数字,然后逐行从另一个程序输出

但是,我的构造不起作用:

IO.popen("count","r+") {|f| puts f.readline}
我该怎么做才能让它工作?可能对测试程序“count”进行了一些修改?

如果您有耐心(大约50秒的时间),您会看到您确实得到了一行输出,该行将是
“1\n”
。你有两个问题:

  • 计数
    正在使用缓冲输出。这意味着在
    count
    的输出缓冲区满之前,
    stdin
    中不会显示任何内容;如果打印的字节数很小,则在
    count
    完成之前不会刷新缓冲区
  • 您的
    popen
    块只查找一行
  • 您可以通过使用关闭
    count
    中的输出缓冲来解决第一个问题:

    STDOUT.sync = true
    for i in 1..50 do
      STDOUT.puts i
      sleep 1
    end
    
    然后,在
    popen
    中,您可以使用以下命令迭代行:


    然后,您应该每秒显示一行输出。

    如果我的测试程序是正常程序,该怎么办?例如cURL或WGET,在这种情况下如何设置STDOUT.sync=true?或者我应该编写一个调用普通程序的“包装器”Ruby程序吗?您是否尝试过使用
    curl
    wget
    ?希望在管道中使用的程序往往具有管道意识,并且自己做正确的事情。否则,等待缓冲区填满。
    IO.popen("count","r+") { |fp| fp.each { |line| puts line } }