python sys.stdout and C++ iostreams::cout

5
我认为sys.stdout应该引用与在相同进程中运行的iostreams::cout相同的物理流,但事实并非如此。下面的代码调用了一个名为"write"的Python包装器,它写入了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的内容?
提前感谢。
3个回答

9

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


2

在 comp.lang.python 的帮助下并经过一些搜索,如 cdhowie 所指出的,标准输出文件句柄必须在更低的级别上进行访问。实际上,它的文件描述符可以通过 sys.stdout.fileno()(应该是 1)获得,然后可以使用 os.dup 和 os.dup2。

我发现这个答案对类似问题非常有帮助。

我真正想要的是将输出捕获到字符串中,而不是文件。然而,python StringIO 类没有文件描述符,不能用于替换实际文件,因此我想出了一个不完全令人满意的解决方法,在其中编写并随后读取临时文件。


1

这不可能是同一个流,因为Python是用C编写的,而不是C++,也没有访问std::cout的权限。它是否使用stdout或基于fd 1实现自己的流,我不知道,但无论如何,在使用这两个对象(Python和C++)进行写操作之间,建议您进行刷新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接