【问题标题】:Running cmd commands through ruby通过 ruby​​ 运行 cmd 命令
【发布时间】:2016-06-03 03:30:50
【问题描述】:

我正在编写一个程序来执行另一个用 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​​ 新手。

【问题讨论】:

  • 我不确定管道是您真正需要的。你看过PTY module吗?
  • 是的! pty 给出了相同的输出,它只适用于 linux,所以这就是我使用这种方法的原因。

标签: ruby popen3


【解决方案1】:

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

  1. 您的换行符不会在单引号内展开。要在字符串中包含换行符,您需要使用双引号,例如 "21\n"
  2. 在某些情况下,您实际上需要回车而不是换行。当试图用终端做类似期望的事情时尤其如此。例如,您可能会发现字符串中需要 \r 而不是 \n

您肯定需要解决第一件事,但您可能还需要尝试第二件事。这绝对是“您的里程可能会有所不同”的情况之一。

【讨论】:

  • 我试过这个stdin.puts "21\n" 但它没有用,它给出了相同的输出。
【解决方案2】:

您似乎希望21 出现在您的屏幕上,因为当您运行temp.exe 并输入21 时它会出现。在这种情况下,它出现在屏幕上的原因是您将它们输入到 shell 中,它会“回显”您输入的所有内容。

但是,当您通过 Ruby 运行程序时,没有 shell,也没有输入,因此即使 21 已正确发送到程序的标准输入,它也不会出现在您的屏幕上。

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

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

(你会注意到我删除了\nIO#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

【讨论】:

  • 感谢您的回复,但是当我执行 'STDOUT.puts "21"' 时,它只会在 stdout.gets 的输出之前打印 21,其余部分与之前相同。
猜你喜欢
  • 2010-10-16
  • 2021-05-18
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多