sys.exit () завершается слишком быстро? - PullRequest
2 голосов
/ 08 октября 2011

Я выполняю некоторый код с вызовом sys.exit () в конце. Без строки sys.exit () self.response прекрасно работает и отображает шаблон. Но когда я вызываю sys.exit (), страница возвращается пустой. Это почти как sys.exit () прерывает среднюю визуализацию шаблона. Почему он это делает?

page = 'index.html'
template_values = {}
path = os.path.join(os.path.dirname(__file__), page)
self.response.out.write(template.render(path, template_values))
sys.exit()

РЕДАКТИРОВАТЬ Я решил свою проблему с помощью «return» вместо «sys.exit ()»

Ответы [ 4 ]

6 голосов
/ 08 октября 2011

Удалить sys.exit().

Если вы основываете его на формулировке http://code.google.com/appengine/docs/python/runtime.html#Responses (которая с тех пор была перефразирована) , представьте на данный момент, что использование «выхода» в первых двух предложениях означает «завершает» или «заканчивает».

1 голос
/ 08 октября 2011

Поскольку другие уже дали хорошие решения, я попытаюсь объяснить, почему это происходит.

Исключение SystemExit, вызванное sys.exit(), отличается от других исключений одним особенным образом.Если он не пойман, sys.excepthook не вызывается .Вместо этого, после печати содержащегося в нем сообщения и извлечения причины выхода, Python завершает работу (Py_Finalize) и вызывает ANSI/C функцию exit(), которая завершает процесс.

Решение состоит в том, чтобыпроцесс завершается нормально (см. другие ответы) или сбрасывает потоки.

0 голосов
/ 08 октября 2011

Попробуйте очистить буфер перед вызовом sys.exit:

page = 'index.html'
template_values = {}
path = os.path.join(os.path.dirname(__file__), page)
self.response.out.write(template.render(path, template_values))
self.response.out.flush()
sys.exit()
0 голосов
/ 08 октября 2011

Кроме того, вы можете поймать SystemExit и вернуться нормально:

def main():
 try:
   ...
 except SystemExit, e:
   # return normally for exit() or exit(0). Otherwise, reraise.
   if e.args and e.args[0]:
     raise

Слегка расширяясь:

Причина, по которой это не работает, заключается в том, что ваш скрипт на Python не запускается как "обычный" CGI & mdash; среди прочего, есть оболочка с перехватом исключений, и sys.exit () реализован путем вызова исключения (которое не подклассифицирует Exception (), поэтому по умолчанию оно не перехватывается).

Я считаю это ошибкой в ​​GAE; Вы можете подать отчет об ошибке. (OTOH, вам действительно не следует использовать sys.exit () в GAE, так как тогда неясно, можно ли повторно запустить вашу функцию main ().)

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