【问题标题】:Calling shell command to run C++ code from Ruby调用 shell 命令从 Ruby 运行 C++ 代码
【发布时间】:2015-09-16 17:55:06
【问题描述】:

我有一个编译的 c++ 文件,我想在 ruby​​ 的临时目录中运行它:

folder = Dir.mktmpdir
      begin
      puts folder
      File.open("#{folder}/input.xml", 'w') { |file| file.write(builder.to_xml) }

      ensure
      system '.././program'
      FileUtils.remove_entry folder
      end

上面的代码正确地创建了所有需要的文件/文件夹,但没有运行系统调用,也没有产生错误。我已经尝试了这里列出的所有品种:Calling shell commands from Ruby,但似乎无法让它发挥作用。如果我注释掉文件删除行并手动执行上面列出的命令,程序可以正常运行。此外,如果我将文件保存到与 ./program 相同的位置,则 ./program 可以工作。是什么阻止我从子文件夹运行命令?

【问题讨论】:

  • 使用system 可以让你检查它的返回值,所以如果你做了puts system '.././program' 控制台会显示什么? True = 0 退出状态,False = 非零存在状态,nil = 执行失败。你也可以在 pry/irb 中尝试,而不需要 puts。
  • 控制台有一个空行表示应该打印输出的位置
  • 我不认为你的路径是正确的,我只是尝试使用来自各种目录的系统并且它正在工作。
  • system 的调用不会“从”任何特定的子文件夹运行,我看不到您更改目录的位置?您是否希望在当前目录等于folder 值的情况下运行该命令?您可能需要 cd - 请参阅 stackoverflow.com/questions/3339883/… - 还考虑使用完整路径,并更改您的 C++ 程序以接受它正在处理的文件的路径,而不是从当前目录加载文件。
  • @NeilSlater:或者更改 C++ 程序以接受标准输入上的 XML 并使用 Open3 与之对话。

标签: ruby-on-rails ruby shell


【解决方案1】:

也许系统查找程序的名称为.././program

试试反引号运算符或 %x 函数

puts `.././program`

puts %x{.././program}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多