在 Popen 中合并 stdout 和 stderr

发布于 2024-11-05 18:01:04 字数 460 浏览 3 评论 0原文

在 Ruby 的 popen/spawn 中,如何将 STDOUT 和 STDERR 合并为单个流,而不求助于使用 >2&1

在 Python 中,这将是:

>>> import subprocess
>>> subprocess.check_output('my_prog args', stderr=subprocess.STDOUT, shell=True)

注意 stderr 参数。

我使用 Open3 - 因为我不想要只是 stdout - 但它已经将它们分成两个流。

In Ruby's popen/spawn, how do I merge both STDOUT and STDERR as a single stream wihthout resorting to using >2&1?

In Python, this would be:

>>> import subprocess
>>> subprocess.check_output('my_prog args', stderr=subprocess.STDOUT, shell=True)

Note the stderr argument.

I use Open3 - as I don't want just stdout - but it already separates them into two streams.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

囍孤女 2024-11-12 18:01:04

使用其他问题中的代码,您可以在此处go:

cmd = 'a_prog --arg ... --arg2 ...'
Open3.popen2({"MYVAR" => "a_value"}, "#{cmd}", {:err => [:child, :out]}) { |i,o|
  # This output should include stderr as well
  output = o.read()
  repr = "$ #{cmd}\n#{output}"
}

一些更改:

  1. popen2 的第三个参数将 stderr 重定向到 stdoutl。请注意,它需要是衍生进程的标准输出,而不是系统范围的标准输出,因此您需要指定 :child:out
  2. 您需要使用 .popen2 而不是 .popen3 因为如果您为 stderr 包含第三个 e 选项,则重定向似乎会被忽略,
  3. 因为您正在使用 .popen2,你只将 |i,o| 传递给块:

Using the code from your other question, here you go:

cmd = 'a_prog --arg ... --arg2 ...'
Open3.popen2({"MYVAR" => "a_value"}, "#{cmd}", {:err => [:child, :out]}) { |i,o|
  # This output should include stderr as well
  output = o.read()
  repr = "$ #{cmd}\n#{output}"
}

A couple changes:

  1. The third parameter to popen2 will redirect stderr to stdoutl. Note that it needs to be the spawned process's stdout, not the system-wide stdout, so you need to specify :child's :out
  2. You need to use .popen2 instead of .popen3 as it seems the redirection is ignored if you include the 3rd e option for stderr
  3. Because you're using .popen2, you only pass |i,o| to the block:
春庭雪 2024-11-12 18:01:04

有点晚了,但是看看 Open3.popen2e - 文档

其行为与popen3 完全相同,但将stderr stdout 合并为块的第二个参数。

所以你可以简单地做

cmd = 'a_prog --arg ... --arg2 ...'
Open3.popen2e(cmd) { |input,output|
 # Process as desired, with output containing stdout and stderr
}

A bit late, but take a look at Open3.popen2e - docs.

This behaves exactly as popen3, but merges stderr stdout as the second argument to the block.

So you can simply do

cmd = 'a_prog --arg ... --arg2 ...'
Open3.popen2e(cmd) { |input,output|
 # Process as desired, with output containing stdout and stderr
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文