【发布时间】:2011-07-22 12:04:13
【问题描述】:
我正在尝试将输出从 SWIG 包装的 C 模块重定向到 python 类。 SWIG 调用者是一个 python 类,它已经通过以下方式覆盖了 sys.stdout:
with _redirect_streams():
my_C_function(sys.stdout)
try:
out_s = sys.stdout.getvalue()
except AttributeError:
out_s = ""
try:
err_s = sys.stderr.getvalue()
except AttributeError:
err_s = ""
class _redirect_streams(object):
def __enter__(self):
self._orig_stdout = sys.stdout
self._orig_stderr = sys.stderr
sys.stdout = StringIO()
sys.stderr = StringIO()
def __exit__(self, exc_type, exc_val, exc_tb):
sys.stdout = self._orig_stdout
sys.stderr = self._orig_stderr
在 SWIG 中,我可以将所有 printf 重定向到我从 python 传递的文件句柄 FILE* fh。
如果我调用传递sys.__stdout__(真实文件对象)的C 函数,它工作正常,但如果我在它被覆盖后传递sys.stdout,它不再是python 文件对象(StringIO)并且C 文件无法打印到那个。
在这种情况下最好的方法是什么?
有没有办法在 python 中捕获标准输出,同时仍将文件类型句柄传递给 C 函数?
编辑:实际上我稍微简化了一点,在我的代码中,my_C_function 仍然是一个 python 函数,它在调用 SWIG-wrapper C 函数时在标准输出上打印出来,该函数本身打印到给定的文件句柄。
谢谢, 赫夫
【问题讨论】:
标签: python redirect stdout swig