有時候需要用到別人的代碼, 但是又不想修改別人的文件, 想拿到輸出的結果, 這時候就需要使用sys
模塊, 將print
輸出的內容重定向到變量中.
Python
調用sys
模塊中的sys.stdout
, 實際上是調用的sys.stdout.write
方法, 這樣如果操作的對象是文件就不會有問題.
import sys
# 保存當前的sys.stdout狀態, 開始捕獲當前的輸出
current = sys.stdout
f = open(path, 'w')
# 這一步實際是sys.stdout.write, 當sys捕獲到了print輸出的時候, 就寫入f里面
sys.stdout = f
print 'test'
# 恢復狀態, 之后的print內容都不捕獲了
sys.stdout = current
但是當把f
文件對象改為一個變量時, 就會報錯AttributeError: 'str' object has no attribute 'write'
, 原因是變量沒有write
方法, 所以根據這個, 我們可以重寫一個方法.
import sys
class __Autonomy__(object):
"""
自定義變量的write方法
"""
def __init__(self):
"""
init
"""
self._buff = ""
def write(self, out_stream):
"""
:param out_stream:
:return:
"""
self._buff += out_stream
current = sys.stdout
a = __Autonomy__()
# 會調用a的write方法, 和self._buff的內容拼接
sys.stdout = a
print 'test'
sys.stdout = current
# 輸出捕獲的內容
print a._buff