问题标签 [popen3]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
810 浏览

ruby - 尝试使用 ruby​​ popen3 检查命令是否存在

我正在尝试使用以下代码检查系统命令是否存在:

但是它只是崩溃并显示以下错误消息并且不会继续:

为什么以及如何解决它?

0 投票
1 回答
610 浏览

ruby - 使用 Open3.capture3 和 rake 时丢失 STDOUT?

我在工作中使用的构建系统会调用几个外部控制台应用程序,Node.js 等。

我看到的问题是 STDOUT 通道在Open3.capture3调用后似乎不起作用。例如,我有一个名为compileLess

我希望看到的是这样的:

但是在调用Open3.capture3disablesputsprint. 我可以通过明确使用来强制他们工作:

我只是想知道为什么它不起作用。

眼镜:

  • 窗口 7 专业版 32 位
  • 红宝石 1.9.3p392 (2013-02-22) [i386-mingw32]
  • 耙子,版本 10.1.0
  • 节点 v0.10.22
0 投票
1 回答
174 浏览

ruby - 从 ruby​​ 运行 `git add -p`

我正试图git add -p逃离红宝石。问题是这个命令显示部分文件并等待用户输入,可能会打开 git 编辑器。由于这个原因,执行系统命令的常规内核方法将不起作用。我尝试使用open3,这是我到目前为止得到的:

我不知道该放什么,在互联网上也找不到任何线索。

有什么想法可以解决这个问题吗?

注意:我不想使用任何宝石

编辑: open3不工作。我现在正在试验pty. 这是我所拥有的:

此代码打印要修补的第一个块,但随后 git 询问的“问题”(换句话说,标准输入提示)没有出现。我显然没有在上面的代码中打印它,但我似乎无法找到如何做到这一点。有任何想法吗?

0 投票
3 回答
463 浏览

ruby - 在不同的 ruby​​ 版本中启动子进程

我正在使用 daemon kit 启动一个后台 ruby​​ 进程来侦听 Amazon SQS 消息。一旦收到一条消息,它就会使用需要在 JRuby 中运行的 Open3.popen3 启动一个子进程。

后台进程需要在 MRI 中运行,因为 daemon kit 使用 Process.daemon 来守护进程。但到目前为止,我还不能强制子进程在 JRuby 中运行。

我正在使用 rbenv 来管理 ruby​​ 版本,所以起初我认为这会起作用:

但是在子进程输出中我收到错误:“rbenv: jruby: command not found”

然后我跟踪了 rbenv 如何运行它的可执行文件,以便我可以绕过 rbenv 并直接在 JRuby 中运行 rp5 可执行文件。

我首先在文件夹中找到了 rp5 可执行文件:~/.rbenv/versions/jruby-1.7.8/bin/rp5

然后我执行 Gem.bin_path 方法来查找它正在调用的 rp5 可执行文件。在 gem 里面: ~/.rbenv/versions/jruby-1.7.8/lib/ruby/gems/shared/gems/ruby-processing-2.3.1/bin/rp5 然后我尝试通过调用运行子进程这个 rp5 可执行文件直接:

但我仍然收到相同的“未找到 jruby 命令”错误。

然后我检查了那个可执行文件:

那么顶部的 shebang 是否意味着该可执行文件正在使用默认的 ruby​​ 版本?

甚至可以在完全不同的 ruby​​ 版本中启动子进程吗?

谢谢。

0 投票
1 回答
3077 浏览

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

我正在使用Open3popen3方法来启动一个进程,该进程以类似控制台/ REPL的方式运行,以重复接受输入并返回输出。

我能够打开进程,发送输入,接收输出就好了,代码如下:

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

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

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

解决方案

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

0 投票
0 回答
797 浏览

ruby - 使用带超时的多线程时,ruby Open3.capture3 中的关闭流(IOError)

我希望运行几个系统命令,并获得以下信息:

  1. 我希望在同一进程下的不同线程中运行每个命令
  2. 我希望捕获并存储输出和退出状态。
  3. 我希望在执行时间上设置超时以查找是否某些系统命令被卡住。

不幸的是,以下代码以:

/usr/lib/ruby/1.9.1/open3.rb:276:inread': closed stream (IOError) from /usr/lib/ruby/1.9.1/open3.rb:276:in块(2 级)在 capture3'

偶尔,依赖于线程调度。例如,当将超时更改为 2 秒(或完全删除超时块)时,代码可以工作。

这是一个示例代码:

我曾尝试过rescueinoutput_from方法并关闭 o,但它也没有帮助。我觉得线程以某种方式在 popen3 实现中共享管道或一些变量。

0 投票
1 回答
268 浏览

linux - IPC::Open3 以与独立 snmwalk 命令不同的行为运行 snmpwalk

我制作了一个自定义 sub 来使用 Open3 在 perl 中运行各种终端命令。

我在使用 snmpwalk 时遇到了一个奇怪的问题,当我在终端中运行该命令时它可以工作,但使用 Open3 则不会。

子是这样的:

我称之为:

如果我想运行以下命令:

snmpwalk -c public -v1 somehostname NETAPP-MIB::aggrName

它以 $err 的形式返回:

snmpwalk:未指定安全名称

如果我在终端中运行完全相同的命令,它会返回我的结果:

NETAPP-MIB::aggrName.1 = 字符串:“SAS2”

NETAPP-MIB::aggrName.2 = 字符串:“SATA1”

...

我发现 NET::SNMP 可以解决我的问题,但由于硬化的 linux 操作系统没有安装选项,我无法安装它。

我真的不明白为什么它不起作用。

perl -v:5.8.8

谢谢!

0 投票
0 回答
147 浏览

ruby-on-rails - Ruby on Rails。将exe文件的输出返回到浏览器

第一次使用 Ruby 或 Rails,所以请多多包涵 :) 我正在尝试将 exe 文件的结果输出到我的浏览器,可能需要事先进行一些处理。我正在使用 Open3

这可行,但输出似乎只在 exe 文件完成时返回任何内容,例如,如果它手动关闭,或者如果它返回错误。

当我执行文件时实际发生的是服务器运行并将信息返回到控制台。我在控制台运行时需要这些数据,而不是之后。

我的问题:如何从控制台实时返回、处理和显示每一行?这甚至可能吗?

0 投票
2 回答
9345 浏览

ruby - Ruby—Open3.popen3 / 如何打印输出

我有一个小 ruby​​ 脚本,它以mysql方式进行导入:mysql -u <user> -p<pass> -h <host> <db> < file.sql,但Open3.popen3用于这样做。这就是我到目前为止所拥有的:

那实际上是在做这项工作,但有一件事情让我感到困扰,与我想看到的输出有关。

如果我将第一行更改为:

然后整个脚本永远挂起。

我想,这是因为读写流相互阻塞,而且我还猜想stdout需要定期刷新,以便stdin继续消耗。换句话说,只要缓冲区stdout已满,进程就会等到它被刷新,但由于这是首先在最底层完成的,所以这永远不会发生。

我希望有人可以验证我的理论?我怎么能写出打印出所有内容的代码,stdout并将所有内容都写入其中stdin

提前谢谢!

0 投票
1 回答
3368 浏览

ruby - 为什么缺少可执行文件时 Open3.popen3 会返回错误错误?

我正在围绕 CLI 制作一个 Ruby 包装器。我找到了一个简洁的方法Open3.capture3(内部使用Open3.popen3),它可以让我执行命令并捕获标准输出、标准错误和退出代码。

我想要检测的一件事是是否找不到 CLI 可执行文件(并为此引发特殊错误)。我知道 UNIX shell127在找不到命令时会给出退出代码。当我$ foo在 bash 中执行时,我得到-bash: foo: command not found了,这正是我想要显示的错误消息。

考虑到所有这些,我编写了如下代码:

但是,当我用 运行它时command = "foo",我得到一个错误:

为什么会出现这个错误?我以为Open3.capture3应该直接在 shell 中执行该命令,为什么我没有得到正常的 STDERR 和退出代码127