5

我假设 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 的字符串。有谁知道发生了什么,如果是这样,我如何才能捕获写入 python 字符串中的 cout 的内容?

提前致谢。

4

3 回答 3

9

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

于 2013-01-17T15:47:49.253 回答
2

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

我发现this answer to a similar question非常有帮助。

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

于 2013-01-20T22:41:26.640 回答
1

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

于 2013-01-17T15:58:39.393 回答