2017-01-05 2 views
0

Ich habe eine Funktion (in einem Projekt), dass es das Ergebnis druckt.Wenn ich es über die Befehlszeile oder in einem anderen Python-Projekt aufrufen, druckt es die Ausgabe auf dem Terminal. Aber ich will das alles drucken speichern Ergebnis in einer Variablen, etwa wie folgt:Zuweisen einer Funktion Ausgabe druckt auf eine Variable in Python

output = function_name(function_args) 

und stattdessen die Ergebnisse des Druckens auf dem Terminal möchte ich sie speichern, in der output Variable. auch, die Hauptfunktion gibt etwas (nur eine Zahl als Status) als das Ergebnis zurück, das ich diese Nummer nicht möchte.

+4

Warum reparieren Sie nicht die Funktion, um das Ergebnis zurückzusenden, anstatt zu drucken? – Barmar

+0

Möglicherweise befindet sich dies im Bibliothekscode, den der Benutzer nicht ändern kann. Gib den Vorteil des Zweifels! – wim

+0

@wim für meine eigene Neugier, wann entsteht das? Nur dass eine Firma es nicht erlaubt, oder gibt es eine praktische Begrenzung, die python innewohnt? – roganjosh

Antwort

1

Sie können diese sys.stdout von rebinding tun:

>>> def foo(): 
...  print('potato') 
... 
>>> import sys, io 
>>> sys.stdout = io.StringIO() 
>>> foo() 
>>> val = sys.stdout.getvalue() 
>>> sys.stdout = sys.__stdout__ # restores original stdout 
>>> print(val) 
potato 

Für eine schönere Art und Weise, es zu tun, sollten Sie einen Kontext-Manager schreiben. Wenn Sie Python 3.4+ verwenden, ist es already been written for you.

>>> from contextlib import redirect_stdout 
>>> f = io.StringIO() 
>>> with redirect_stdout(f): 
...  foo() 
... 
>>> print(f.getvalue()) 
potato 
0

Die sinnvolle Lösung ist einfach und offensichtlich: die Funktion reparieren, damit sie die richtigen Daten zurückgibt, anstatt sie zu drucken. Sonst Sie können verwenden Sie den Hack von Wim gepostet, aber vorausgesetzt, Sie haben die Hand auf die fehlerhafte Funktion Zuflucht zu einer solchen gewundenen Lösung fällt in die Kategorie "WTF".

NB natürlich, wenn Sie nicht die Hand auf die Funktion Code oder es ist nur für eine 5 Minuten One-Shot-Skript, Capturing sys.stdout ist ein handliches Fallback.

Verwandte Themen