我假设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的内容?
提前致谢。
答案 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 ++)编写。