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

时间:2013-01-17 15:45:53

标签: c++ python stdout stringio

我假设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的内容?

提前致谢。

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

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

我发现this answer对类似的问题非常有帮助。

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

答案 2 :(得分:1)

它不可能是同一个流,就像Python一样 C,而不是C ++,并且无法访问std::cout。无论 使用stdout或基于fd 1实现自己的流, 我不知道,但无论如何,你会被建议在两者之间进行冲洗 使用两个对象(Python和C ++)编写。