有没有办法获取过去(或至少是最后一次)“打印”电话?

时间:2011-04-03 20:18:57

标签: python

考虑:

print "Hello"
print "Goodbye"

有没有办法获取那些打印电话中的内容?

示例:

print "The last print was", output.previousMessage()

3 个答案:

答案 0 :(得分:3)

>>> import sys
>>> last_print = None
>>>
>>> # this class will replace sys.stdout
>>> class PrintCatcher:
...     # catch and save writes (prints)
...     def write(self, data):
...         global last_print
...         if data != "\n": last_print = data
... 
...         # write the data to the original stdout object
...         sys.__stdout__.write(data)
...         sys.__stdout__.flush()
...
...     # forward attribute gets to the original stdout object
...     def __getattr__(self, attr):
...         return getattr(sys.__stdout__, attr)
... 
>>> print "Hello"
Hello
>>> last_print
>>> sys.stdout = PrintCatcher()
>>> print "Goodbye"
Goodbye
>>> last_print
'Goodbye'

基本上,您正在用您自己的包装器对象替换sys.stdout(这是类似文件的对象print写入),该对象记录数据并将数据转发到sys.__stdout(始终是原始sys.stdout)。

虽然这并不完美,因为你可以看到它会忽略换行符,所以如果你print没有任何参数,它就不会记录它。

如果要记录所有打印件,只需将last_print列为一个列表并将所有消息附加到该列表,而不是仅为其分配最后一个打印件。

答案 1 :(得分:0)

我没有看到类似的东西,但你可能总是制作自己的印刷类,可以保存最后一条消息,以便以后检索。

答案 2 :(得分:0)

由于print默认输出到stdout,也许你可以重定向它并截取通过的内容......例如:

import sys
from StringIO import StringIO

newout = StringIO()

# Redirect
sys.stdout = newout
print "Hello" # Nothing gets printed

sys.stdout = sys.__stdout__
print "Back to normal"
print newout.getvalue() # Prints "Hello"

当然,如果你希望print在“捕获”模式下显示某些内容,你必须实现StringIO的子类。