【发布时间】:2011-08-19 16:44:23
【问题描述】:
def captureOutput(self, func, *args, **kwargs):
pass
sys.stdout.flush()
sys.stderr.flush()
(outfd, fn) = tempfile.mkstemp()
fout = os.fdopen(outfd, 'r')
os.unlink(fn)
(errfd, fn) = tempfile.mkstemp()
ferr = os.fdopen(errfd, 'r')
os.unlink(fn)
try:
oldstdout = os.dup(sys.stdout.fileno())
oldstderr = os.dup(sys.stderr.fileno())
os.dup2(outfd, sys.stdout.fileno())
os.dup2(errfd, sys.stderr.fileno())
try:
ret = func(*args, **kwargs)
finally:
sys.stderr.flush()
sys.stdout.flush()
os.dup2(oldstdout, sys.stdout.fileno())
os.close(oldstdout)
os.dup2(oldstderr, sys.stderr.fileno())
os.close(oldstderr)
os.lseek(outfd, 0, 0)
out = fout.read()
os.lseek(errfd, 0, 0)
err = ferr.read()
finally:
fout.close()
ferr.close()
return ret, out, err
运行此代码时,出现错误:
AttributeError:StringIO 实例没有属性“fileno”为什么会出现此错误,我该如何纠正?
【问题讨论】:
-
需要更多代码,outfd和errfd是什么?
-
你使用的是标准的普通 python 解释器吗?当您使用覆盖 stdout/stderr 的解释器时,可能会出现此错误,例如 IDLE(尽管 IDLE 本身会给您一个不同的错误)。它也可能是由覆盖 stdout/stderr 的库引起的。
标签: python