2016-08-14 44 views
-1

我有Python中的函數:如何將一個函數中的所有打印結果放入一個變量中?

def f(): 
    ... 
    a lot of code 
    ... 
    print "hello" 
    ... 
    a lot of code 
    ... 

我想調用這個函數,但是,打印結果將被放入一個變量直接在屏幕上,而不是打印。我如何用Python做到這一點? ps: 請不要只是返回,有時我不知道打印語句在哪裏。

+1

我不明白downvotes,是不是這樣的完全合理的問題? – Jasper

+0

我認爲這是因爲你的問題不清楚。通常最好提供[MCVE](http://stackoverflow.com/help/mcve),以便人們可以重現您的問題。另外,有些人會因爲不加解釋而退縮。我覺得這根本沒有幫助。 – Gabriel

回答

3

假設print正在寫入sys.stdout,您可以暫時將其替換爲StringIO對象。

stdout = sys.stdout 
sys.stdout = StringIO() 
f() 
x = sys.stdout.getvalue() 
sys.stdout = stdout 

或者,如果你要的文件的引用搞定print使用,你可以用這個來代替sys.stdout

如果有從內fprint多種用途,並且只想捕捉他們的一些(比方說,只有從由內f調用的函數g),恐怕你的運氣了。你需要做的內省的數量可以讓你簡單地重新實現這個功能來在變量中累積所需的輸出,而不是使用print

-1
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()) 
+0

我不知道print語句在哪裏,因爲我在這個函數中調用了其他函數。 – maple

+0

發佈您的代碼來幫助我們 –

1

使用如下

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() 
1

你也可以,如果你發現你需要定義自己的上下文管理一個裝飾做這個很多,所以你可以捕捉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 
相關問題