考虑:
print "Hello"
print "Goodbye"
有没有办法获取那些打印电话中的内容?
示例:
print "The last print was", output.previousMessage()
答案 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的子类。