【问题标题】:python sys.stdout and C++ iostreams::coutpython sys.stdout 和 C++ iostreams::cout
【发布时间】:2013-01-01 05:02:25
【问题描述】:

我假设 sys.stdout 将引用与在同一进程中运行的 iostreams::cout 相同的物理流,但情况似乎并非如此。 以下代码使用名为“write”的 python 包装器调用 C++ 函数,并写入 cout:

from cStringIO import StringIO 
import sys 
orig_stdout = sys.stdout 
sys.stdout = stringout = StringIO() 
write("cout") # wrapped C++ function that writes to cout 
print "-" * 40 
print "stdout" 
sys.stdout = orig_stdout 
print stringout.getvalue() 

立即将“cout”写入控制台,然后是分隔符“---...”,最后,作为 stringout.getvalue() 的返回值,字符串“stdout”。 我的意图是在 stringout 中捕获从 C++ 写入 cout 的字符串。 有谁知道发生了什么,如果是这样,我如何捕获写入 cout 的 python 字符串?

提前致谢。

【问题讨论】:

    标签: c++ python stdout stringio


    【解决方案1】:

    sys.stdout 是一个写入标准输出的 Python 对象。它实际上不是标准输出文件句柄;它包装那个文件句柄。在 Python 中更改 sys.stdout 指向的对象不会以任何方式影响 C++ 中的 stdout 句柄或 std::cout 流对象。

    【讨论】:

      【解决方案2】:

      在 comp.lang.python 的帮助下并在此站点上进行了一些搜索后: 正如 cdhowie 指出的,标准输出文件句柄必须在较低级别访问。其实它的文件描述符可以获取为sys.stdout.fileno()(应该是1),然后就可以使用os.dup和os.dup2了。

      我发现this answer 对类似问题很有帮助。

      我真正想要的是以字符串而不是文件的形式捕获输出。然而,python StringIO 类没有文件描述符,不能用来代替实际文件,所以我想出了一个不完全令人满意的解决方法,即写入并随后读取临时文件。

      【讨论】:

        【解决方案3】:

        不可能是同一个流,因为 Python 是用 C,而不是 C++,并且无权访问 std::cout。无论 使用stdout或基于fd 1实现自己的流, 我不知道,但无论如何,建议你在 使用两个对象(Python 和 C++)写入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-04
          • 2018-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多