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

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

本文关键字:iostreams cout C++ and sys stdout python      更新时间:2023-10-16

我假设sys。Stdout将引用与在同一进程中运行的iostreams::cout相同的物理流,但情况似乎并非如此。下面的代码用python包装器"write"调用一个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"写入控制台,然后将分隔符"——…"写入控制台,最后将字符串"stdout"作为stringout.getvalue()的返回值。我的意图是在stringout中捕获从c++中写入cout的字符串。有没有人知道发生了什么,如果是这样,我怎么能捕捉什么是写在一个python字符串?

提前感谢。

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

在comp.lang.python的帮助下,在这个网站上搜索了一下:正如cdhowie指出的,必须在较低级别访问标准输出文件句柄。实际上,它的文件描述符可以通过sys.stdout.fileno()(应该是1)获得,然后是os. stdout.fileno()。Dup和os。可以使用Dup2。

我发现这个类似问题的答案很有帮助。

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

它不可能是同一个流,因为Python是用同一个流编写的C,而不是c++,并且不能访问std::cout。它是否使用stdout或基于fd 1实现自己的流,我不知道,但无论如何,你最好在两者之间冲洗一下使用两个对象(Python和c++)进行写入。