通过ruby运行cmd命令

时间:2016-02-21 19:55:39

标签: ruby popen3

我正在编写一个执行用c编写的其他程序的程序,这是我的第一次尝试

require 'Open3'

system 'tcc temp.c'

Open3.popen3('temp.exe') do |stdin, stdout, stderr|
   stdin.puts '21\n'
   STDOUT.puts stdout.gets
end

实际输出:

Enter the temperature in degrees fahrenheit: The converted temperature is -6.11

期望的输出:

Enter the temperature in degrees fahrenheit: 21
The converted temperature is -6.11

如果你知道更好的方法,请告诉我,我是ruby的新手。

2 个答案:

答案 0 :(得分:1)

您似乎至少有两个潜在问题:

  1. 您的换行符不会在单引号内展开。要在字符串中包含换行符,您需要使用双引号,例如push_back
  2. 在某些情况下,您实际上需要回车而不是换行。当尝试使用终端进行类似Expect的事情时尤其如此。例如,您可能会在字符串中找到"21\n"而不是\r
  3. 你肯定需要修复第一件事,但你也可能需要尝试第二件事。这肯定是“你的里程可能会有所不同”的情况之一。

答案 1 :(得分:1)

您似乎希望21出现在屏幕上,因为当您运行temp.exe并输入21时,它就会出现。在这种情况下它出现在你的屏幕上的原因是你要在你的shell中输入它们,然后回复"支持你输入的所有内容。

但是当你通过Ruby运行程序时,没有shell而且没有输入,所以即使将21正确发送到屏幕上,require 'Open3' system 'tcc temp.c' Open3.popen3('temp.exe') do |stdin, stdout, stderr| STDOUT.puts "21" stdin.puts '"21" STDOUT.puts stdout.gets end 也不会显示在屏幕上该计划的标准输入。

最简单的解决方案非常简单。只需将其写入Ruby的标准输出:

\n

(您注意我已取出IO#puts - def echo(io, *args) puts *args io.puts *args end 为您添加。)

但这有点重复。您可以定义一个简单的方法来为您处理它:

Open3.popen3('temp.exe') do |stdin, stdout, stderr|
  echo(stdin, "21")
  puts stdout.gets
end

然后:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(CLIENT_ID)
            .requestEmail()
            .build();