В Python в Google App Engine, как вы фиксируете вывод, созданный оператором print? - PullRequest
0 голосов
/ 21 января 2010

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

Как бы вы изменили этот пример для захвата всего, что написано оператором print?

#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 ]

5 голосов
/ 22 января 2010

Я думаю, Hooked имеет правильный ответ , но я думаю, что вам лучше сохранить значение sys.stdout перед его изменением и восстановить это значение впоследствии, а не восстановление sys.__stdout__, потому что (я думаю) среда выполнения App Engine по-своему работает с 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
4 голосов
/ 21 января 2010

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

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<br> sys.stdout = sys.__stdout__

Для восстановления нормальной функции печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...