【问题标题】:Extracting stderr from pexpect从 pexpect 中提取标准错误
【发布时间】:2014-11-27 22:17:10
【问题描述】:

我的问题很简单:我可以expect() 使用 pexpect 在 stderr 上查看某些输出吗?看来pexpect.spawn() 只能用于期望在标准输出上的输出。

乌托邦式的例子:

import pexpect child = pexpect.spawn(...) child.expect("hi", fd=pexpect.STDERR)

或者在散文中,“在 stderr 上期待字符串 'hi'”。

我没有在文档中找到任何提及此类工具的内容,但我确实注意到 child 实例具有 stderr 属性...

半实现我想要的一个技巧是将stderr重定向到spawn参数中的stdout,然后我们可以使用常规expect()。一定有更好的办法吗?

干杯

【问题讨论】:

  • Pexpect 在 pty 中运行您的子进程,因此所有标准流(stdin、stdout 和 stderr)都指向该 pty,并且控制进程写入和读取该单个 pty。它无法分别访问 stdout 和 stderr:它们将在输出中交错,就像在常规终端中运行进程一样。如果您需要单独访问,您可以使用subprocess.Popen 启动该过程,然后使用pexpect.fdpexpect.fdspawn 只查看其中一个管道。
  • 谢谢。听起来它会起作用。你有一个例子,我会把它标记为答案:)

标签: python pexpect


【解决方案1】:

为了后代,根据Thomas K 的评论,这似乎可以满足您的需求:

import os
import subprocess
from pexpect import fdpexpect

program = ['/path/to/command', '--arg1', 'value1', '--arg2', 'value2']
devNull = open(os.devnull, 'w')
command = subprocess.Popen(program, stdout=devNull,
                           stdin=subprocess.PIPE, stderr=subprocess.PIPE)
child = fdpexpect.fdspawn(command.stderr)
child.expect('hi')

【讨论】:

  • 如果你不写信给command.stdin,你可能应该使用stdin=DEVNULL(将'r+b'传递给open()
猜你喜欢
  • 2012-06-21
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多