我有Python中的函數:如何將一個函數中的所有打印結果放入一個變量中?
def f():
...
a lot of code
...
print "hello"
...
a lot of code
...
我想調用這個函數,但是,打印結果將被放入一個變量直接在屏幕上,而不是打印。我如何用Python做到這一點? ps: 請不要只是返回,有時我不知道打印語句在哪裏。
我有Python中的函數:如何將一個函數中的所有打印結果放入一個變量中?
def f():
...
a lot of code
...
print "hello"
...
a lot of code
...
我想調用這個函數,但是,打印結果將被放入一個變量直接在屏幕上,而不是打印。我如何用Python做到這一點? ps: 請不要只是返回,有時我不知道打印語句在哪裏。
假設print
正在寫入sys.stdout
,您可以暫時將其替換爲StringIO
對象。
stdout = sys.stdout
sys.stdout = StringIO()
f()
x = sys.stdout.getvalue()
sys.stdout = stdout
或者,如果你要的文件的引用搞定print
使用,你可以用這個來代替sys.stdout
。
如果有從內f
的print
多種用途,並且只想捕捉他們的一些(比方說,只有從由內f
調用的函數g
),恐怕你的運氣了。你需要做的內省的數量可以讓你簡單地重新實現這個功能來在變量中累積所需的輸出,而不是使用print
。
def f():
#code
variable = 'hello\n'
#code
variable += 'hello2\n'
#code
...
print(variable)
或
def f():
#code
variable = 'hello\n'
#code
variable += 'hello2\n'
#code
...
return(variable)
然後
print(f())
我不知道print語句在哪裏,因爲我在這個函數中調用了其他函數。 – maple
發佈您的代碼來幫助我們 –
使用如下
import sys
from StringIO import StringIO
s = StringIO()
def catch_stdout(user_method):
sys.stdout = s
def decorated(*args, **kwargs):
user_method(*args, **kwargs)
sys.stdout = sys.__stdout__
print 'printing result of all prints in one go'
s.seek(0, 0)
print s.read()
return decorated
@catch_stdout
def test():
print 'hello '
print 'world '
test()
你也可以,如果你發現你需要定義自己的上下文管理一個裝飾做這個很多,所以你可以捕捉o對於安輸出語句塊,如:
import contextlib
from StringIO import StringIO
import sys
@contextlib.contextmanager
def capture_stdout():
old_stdout = sys.stdout
sys.stdout = StringIO()
yield sys.stdout, old_stdout
sys.stdout = old_stdout
然後使用方法如下:
def something():
print 'this is something'
# All prints that go to stdout inside this block either called
# directly or indirectly will be put into a StringIO object instead
# unless the original stdout is used directly...
with capture_print() as (res, stdout):
print 'hello',
print >> stdout, "I'm the original stdout!"
something()
print res.getvalue() + 'blah' # normal print to stdout outside with block
爲您提供:
I'm the original stdout
hello this is something
blah
我不明白downvotes,是不是這樣的完全合理的問題? – Jasper
我認爲這是因爲你的問題不清楚。通常最好提供[MCVE](http://stackoverflow.com/help/mcve),以便人們可以重現您的問題。另外,有些人會因爲不加解釋而退縮。我覺得這根本沒有幫助。 – Gabriel