【问题标题】:Redirection of stdout from a SWIG-wrapped C++ class to a non-file python object将标准输出从 SWIG 包装的 C++ 类重定向到非文件 python 对象
【发布时间】: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


    【解决方案1】:

    我只能为您提供一种方法。
    1. 使用 os.pipe() 创建一个 fd 对 2.将“写”管道传递给你的C 3.用该管道覆盖“stdout”(在C-land中) 4. 现在“C”标准输出将出现在 os.pipe() 的“读取”端 5. 回到 python-land,从管道中读取并写入 Python 的标准输出。

    ...可能有更简单的方法...

    【讨论】:

    • 谢谢安德鲁,这行得通。但是,现在我必须主动读取管道并写入标准输出(如果有的话)。我试图避免线程化,但至少它可以让我继续前进。
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多