В Python в Google App Engine, как вы извлекаете вывод, созданный оператором печати?

Я работаю в среде Google Application Engine, где я загружаю доктрины и код python из строк, чтобы проверить домашние задания Python. Моя основная реализация ( предоставленная Алексом Мартелли ), по-видимому, работает для всех моих проблем, кроме тех, которые содержат заявление печати. Что-то кажется неправильным, когда я пытаюсь выполнить команду печати в GAE.

Как бы вы могли изменить этот пример, чтобы зафиксировать все, что было выписано оператором печати?

#This and most other code works class X(object): pass x=X() exec 'a=23' in vars(x) #This throws an error. class X(object): pass x=X() exec 'print 23' in vars(x) 

2 Solutions collect form web for “В Python в Google App Engine, как вы извлекаете вывод, созданный оператором печати?”

Я думаю, что у Hooked есть правильный ответ , но я думаю, что вам лучше сохранить значение sys.stdout прежде чем изменять его и впоследствии восстановить это значение, а не восстанавливать sys.__stdout__ потому что (я думаю) sys.stdout по-своему.

Это оставляет вам что-то вроде

 import StringIO import sys # Store App Engine's modified stdout so we can restore it later gae_stdout = sys.stdout # Redirect stdout to a StringIO object new_stdout = StringIO.StringIO() sys.stdout = new_stdout # Run your code here, however you're doing that # Get whatever was printed to stdout using the `print` statement (if necessary) printed = new_stdout.getvalue() # Restore App Engine's original stdout sys.stdout = gae_stdout 

Для этой проблемы мне нравится захватывать вывод строки напрямую. Внутри вашей функции я бы использовал что-то вроде:

 import StringIO, sys # create file-like string to capture output codeOut = StringIO.StringIO() # capture output and errors sys.stdout = codeOut err = '' try : exec code in code_namespace except Exception: err = str(sys.exc_info()[1]) 

И закончите с:
# restore stdout and stderr
sys.stdout = sys.__stdout__

Чтобы восстановить нормальную функцию печати.

Python - лучший язык программирования в мире.