ruby popen3——如何在不重新打开进程的情况下重复写入标准输入和读取标准输出?

2023-11-24

我在用Open3's popen3启动一个在类似控制台/中运行的进程的方法REPL重复接受输入并返回输出的时尚。

我可以使用如下代码打开进程、发送输入并接收输出:

Open3.popen3("console_REPL_process") do |stdin, stdout, stderr, wait_thr|
    stdin.puts "a string of input"
    stdin.close_write
    stdout.each_line { |line| puts line } #successfully prints all the output
end

我想连续多次这样做,而不重新打开该进程,因为启动需要很长时间。

我知道我必须关闭标准输入才能让标准输出返回..但我不知道的是,如何“重新打开”标准输入以便可以写入更多输入?

理想情况下我想做这样的事情:

Open3.popen3("console_REPL_process") do |stdin, stdout, stderr, wait_thr|
    stdin.puts "a string of input"
    stdin.close_write
    stdout.each_line { |line| puts line }

    stdin.reopen_somehow()

    stdin.puts "another string of input"
    stdin.close_write
    stdout.each_line { |line| puts line }
    # etc..
end

solution

感谢 pmoo 的回答,我能够使用以下方法设计一个解决方案PTY and expect,期望进程在准备好更多输入时返回提示字符串,如下所示:

PTY.spawn("console_REPL_process") do |output, input|
    output.expect("prompt >") do |result|
      input.puts "string of input"
    end
    output.expect("prompt >") do |result|
      puts result
      input.puts "another string of input"
    end
    output.expect("prompt >") do |result|
      puts result
      input.puts "a third string of input"
    end
    # and so forth
end

您可以使用以下方法取得一些成功expect库,并让子进程显式标记每个输出的结尾,例如:

require 'expect'
require 'open3'

Open3.popen3("/bin/bash") do
    | input, output, error, wait_thr |
    input.sync = true
    output.sync = true

    input.puts "ls /tmp"
    input.puts "echo '----'"
    puts output.expect("----", 5)

    input.puts "cal apr 2014"
    input.puts "echo '----'"
    puts output.expect("----", 5)
end

作为奖励,expect has a timeout option.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ruby popen3——如何在不重新打开进程的情况下重复写入标准输入和读取标准输出? 的相关文章

  • Guard 不会加载 WDM

    我正在学习 Michael Hartl 的 Rails 教程 到目前为止该教程非常出色 我在高级设置一章中 他以有利于 TDD 的方式配置 Rails 环境 我安装了 Guard 并且通过运行我在 spec 文件夹中的测试 它一直正常运行
  • 在 Rails 3.2 + SimpleForm 中显示嵌套表单有错误的字段

    我有一个Flight模型嵌套在一个FlightLog模型 AFlightLog可能包含许多航班 我使用 SimpleForm 进行引导安装 这样当验证失败时 可以用错误类包围带有错误的表单元素 问题是 即使触发了嵌套模型的验证 simple
  • 使用 Ruby on Rails 进行设计 - 强制用户在首次登录时更改密码

    我有一个运行 Devise 的 RoR 应用程序 Rails 4 2 Ruby 2 2 0 我已经进行了设置 以便管理员用户 标识了我添加到用户模型中的 is admin 布尔值 能够创建新的用户帐户 为他们提供生成的密码和确认电子邮件 这
  • 验证 ActionCable 连接

    我发现了一个很棒的 ActionCable gem 它是 SPA 的一个很好的解决方案 我只想发送html css and js资产 所有其他连接将通过ActionCable 交换字符串或者整数并不难 但是如何通过ActionCable登录
  • 为什么这个 Ruby 方法返回“空值表达式”错误?

    我有这个简单的方法 def is palindrome sentence raise ArgumentError new expected string unless sentence is a String safe sentence s
  • 类、模块、它们的特征类和方法查找

    我们来开公开课吧Module并向其中添加一个方法 class Module def foo puts phew end end 我可以通过这样做来调用这个方法 Class foo 这是可以理解的 因为类Class is Class 其超类是
  • Rails 中的 PDF 导出

    我需要将包含一些图表的 HTML 页面导出为 PDF 有哪些好的 gem 可以做到这一点 PDFKit http railscasts com episodes 220 pdfkit http railscasts com episodes
  • Ruby 中的并行赋值运算符

    我正在查看 Ruby 编程 书中的一个示例 def fib up to max i1 i2 1 1 parallel assignment i1 1 and i2 1 while i1 lt max yield i1 i1 i2 i2 i1
  • 在私有控制器方法中返回redirect_to

    前言 我正在使用设备进行身份验证 我试图阻止未经授权的用户查看 编辑或更新其他用户的信息 我最关心的是用户将 DOM 中的表单修改为另一个用户的 ID 填写表单 然后单击更新 我已经专门阅读过 像下面这样的东西应该有效 但事实并非如此 SO
  • 如何向 Time.now 添加两周?

    如何在 Ruby 中向当前 Time now 添加两周 我有一个使用 DataMapper 的小型 Sinatra 项目 在保存之前 我有一个字段填充了当前时间加上两周 但未按需要工作 任何帮助是极大的赞赏 我收到以下错误 NoMethod
  • Watir 更改 Mozilla Firefox 首选项

    我正在使用 Watir 运行 Ruby 脚本来自动执行一些操作 我正在尝试自动将一些文件保存到某个目录 因此 在我的 Mozilla 设置中 我将默认下载目录设置为桌面并选择自动保存文件 然而 当我开始运行脚本时 这些更改并未反映出来 似乎
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • 没有要加载的文件 - ffi_c (LoadError)

    这个问题困扰了我几天 每当我使用 bring to front 方法时 require rubygems require watir browser Watir Browser new browser bring to front 我收到此
  • Ruby require 'file' 不起作用,但 require './file' 可以。为什么?

    我有一个充满 ruby 文件的文件夹 当我尝试使用位于同一目录中的另一个文件中的一个文件时require file 我得到一个LoadError但是当我使用require file 一切正常 有人可以向我解释为什么会发生这种情况吗 如果有什
  • 我无法让 ruby​​ 开发工具包适用于 Windows XP

    所以 我一生都无法让它正常工作 我的最终目标是安装 dbd odbc gem 并使其正常工作 从我读过的多篇文章来看 我需要安装ODBC 绑定 http www ch werner de rubyodbc 对于 ruby 以及 dbd od
  • ruby从1.8.7升级到1.9.2(使用Rails 3.1.1)后本地服务器错误

    我刚刚安装了rvm并使用rvm将ruby从1 8 7升级到1 9 2 我在我的应用程序上运行了捆绑安装 它重新安装了我的 gems 当我在本地运行 Rails 服务器并将浏览器导航到 localhost 3000 时 服务器日志中显示以下错
  • 我可以将 MAMP (MySQL) 或 XAMPP (MySQL) 与 Ruby on Rails 3 一起使用吗?

    我可以将 MAMP MySQL 或 XAMPP MySQL 与 Ruby on Rails 3 一起使用吗 我从 MYSQL com 安装了 MySQL 但遇到了很多麻烦 所以我喜欢使用 MAMP XAMPP Mysql 有人这样做吗 另外

随机推荐

  • Emacs 字体锁定模式:提供自定义颜色而不是面孔

    On 本页讨论字体锁定模式 提供了一个突出显示自定义模式的示例 add hook c mode hook lambda font lock add keywords nil lt FIXME 1 font lock warning face
  • 获取 std::any 的大小

    有什么方法可以获取存储的数据的大小 以字节为单位 std any 我想出的唯一解决方法是通过以下方式查询其值的类型std any type并将结果与 已知类型的列表进行比较 例如my any type typeid T 那么尺寸就是size
  • HTML 中的
  • 标签有结束标签吗?
  • 所以 我在大学学习 HTML 中的列表 教授说 li 没有结束标签 li 以及其他一些标签 例如 img and br 这是否正确 因为我见过很多模板 主题使用 The li element有一个结束标记 but 这是可选的在某些情况下 A
  • 如何获取节点子模块的模块

    假设模块 X 有一个 Y 子模块 从依赖于 X 的节点应用程序中 我如何需要子模块 Y var Y require X Y 结果是Cannot find module X Y 子模块意味着从 X 模块内部导出 Try require X p
  • C# 双精度数相除时精度损失

    我知道这已经被讨论了一次又一次 但我似乎无法得到哪怕是最简单的双精度单步除法的例子 以在 C 中产生预期的 不四舍五入的结果 所以我想知道是否可能即有一些编译器标志或其他我没有想到的奇怪的东西 考虑这个例子 double v1 0 7 do
  • MVVM Light:在 XAML 中添加 EventToCommand 而无需 Blend,更简单的方法或片段?

    谁能告诉我实际的语法是什么EventToCommand班级 据我所知EventToCommand类适用于 Silverlight WPF 和 WP7 因此我认为这是一个更好的选择 据我所知 我可以添加任何点击事件并将其强制到我的ViewMo
  • wait()/notify()同步

    我正在尝试检查等待 通知在java中如何工作 Code public class Tester public static void main String args MyRunnable r new MyRunnable Thread t
  • UIPageViewController 方向仅向前

    目标是创建一个只能向前导航的 UIPageViewController 我正在使用数据源为 UIPageViewController 提供内容 方向设置为UIPageViewControllerNavigationDirectionForw
  • 使用 Jython 将我的 Python 脚本作为 JAR 文件分发?

    我成为一名 Python 程序员已经快两年了 我习惯于编写小脚本来自动执行一些我必须在办公室执行的重复性任务 现在 显然我的同事注意到了这一点 他们也想要这些脚本 他们中有些人有 Mac 有些人有 Windows 我在窗户上做了这些 我研究
  • 以编程方式获取谷歌搜索结果计数的最简单(合法)方法?

    我想使用 Java 代码获取某些 Google 搜索引擎查询 在整个网络上 的估计结果数 我每天只需要执行很少的查询 所以一开始Google 网页搜索 API 虽然已弃用 但似乎足够好 参见例如如何以编程方式搜索 Google Java A
  • 如何同时使用“gulp-babel”和“gulp-browserify”

    我尝试编写这些代码 gulp task script function use strict return gulp src app js components jsx pipe babel pipe browserify pipe gul
  • Windows 上有获取路线信息的 C/C++ API 吗?

    是否有 Windows 或 cygwin C C API 来收集 Windows 上的路由命令提供的信息 我对路线指标特别感兴趣 这是路由输出的示例 IP 已更改以保护无辜者 route PRINT 4 Interface List 11
  • 在android中从Google Plus获取用户名

    我已将 Google plus 与我的 Android 应用程序集成 一切工作正常 我也连接到 Google plus 但我无法获取当前登录用户的名称 public void onConnected Bundle connectionHin
  • Wix - 如何在没有 UI 的情况下运行/安装应用程序

    我有 exe 文件 需要将其转换为 msi 并使用组策略在域中的更多计算机上安装它 而无需用户交互 我找到了这个教程https stackoverflow com questions 19271862 wix how to run exe
  • 从 Word 中复制 Mathml 格式的方程

    我使用内置的方程编辑器在 Word 2013 中创建了大量数学方程 我需要将这些方程输入到支持 mathml 的基于浏览器的编辑器 带有 fmath 插件的 CKEditor 中 有没有办法从word复制这些方程并将它们作为mathml粘贴
  • 设置 WPF TabControl 为每个选项卡显示相同的内容

    我想使用 TabControl 其中每个选项卡显示相同的视图 只是参数不同 因此 我不想为每个选项卡创建新的内容控件 而是为所有选项卡重用相同的控件 将其某些属性绑定到SelectedItem的财产TabControl 我尝试将我包含的控件
  • ggplot2 为分面图中的两个 Y 轴添加单独的图例

    我正在尝试在轴标题旁边添加图例 我跟着这个 stackoverflow 答案得到情节 如何在两个y轴上添加图例 我想在左右 Y 轴上都有图例 在下图中 右侧 y 轴缺少图例符号 还可以为类似于图例中的符号的文本提供独特的颜色 同时 如何将图
  • 在 PowerShell 中获取 Azure Active Directory 密码到期日期

    我正在使用 Azure Active Directory 并想知道用户的密码何时过期 目前 我使用这些 PowerShell 命令成功连接到 msol 服务并获取密码到期日期 但我不太确定如何获取密码到期日期 我正在使用 Azure Act
  • 帮助解决 cabal 安装包阴影错误

    我现在对两个不相关的包遇到了同样的错误 missingpy 和 monadiccp gt cabal install p v monadiccp 一些输出后 Creating dist build and its parents usr l
  • ruby popen3——如何在不重新打开进程的情况下重复写入标准输入和读取标准输出?

    我在用Open3 s popen3启动一个在类似控制台 中运行的进程的方法REPL重复接受输入并返回输出的时尚 我可以使用如下代码打开进程 发送输入并接收输出 Open3 popen3 console REPL process do std