Я работаю над веб-приложением на Python с Heroku, и я не могу понять, как эффективно протестировать его. Я пытался использовать print (...) и sys.stdout.write(...), но я никогда не вижу никакого вывода, когда я запускаю локально с "стартом мастера" или когда я развертываю в облаке и запускаю "журналы героя", чтобы увидеть облачные журналы. Кроме того, я не могу понять, как отлаживать ошибки времени выполнения python, например, когда возникает исключение. Веб-запрос для приложения возвращает HTTP 500, но у меня нет способа отладки, чтобы увидеть, откуда возникло исключение. Есть ли способ увидеть эту информацию?
Как увидеть вывод журнала Heroku и результат выполнения во время работы python
Ответ 1
Добавление sys.stdout.flush()
после того, как операторы печати решили эту проблему для меня.
В моем случае проблема заключалась в том, что stdout буферизуется, а stderr - нет.
Если вы даже не видите исключения через foreman start
, убедитесь, что на самом деле вы нажимаете на свой сервер на правильном IP/PORT. Вы должны увидеть записи доступа HTTP (например, GET/index.html) на выходе из foreman start
.
Кроме того, вы можете попробовать использовать веб-фреймворк для работы в режиме отладки - большинство современных фреймворков будут показывать стеки в браузере в режиме debug/dev. Использование колбы? app.config['DEBUG'] = True
или app.run(..., debug=True)
.
# logging helper
def p(*args):
print args[0] % (len(args) > 1 and args[1:] or [])
sys.stdout.flush()
Ответ 2
Если вы используете Foreman для запуска проекта Python, и вам не удается увидеть stdout/stderr, вот несколько решений для вас. Если вы используете Procfile для непосредственного вызова CLI python, вы можете использовать опцию '-u', чтобы избежать буферизации stdout:
python -u script.py
Если вы используете Procfile для управления WSGI-сервером, например, вызывая gunicorn, флягу, бутылку, канун и т.д., вы можете добавить файл ".env" в корень вашего проекта python, содержащий следующие
PYTHONUNBUFFERED=True
Также см. ответы на этот вопрос: мастер только показывает строку с "start wit pid #" и ничего больше
Ответ 3
Примечание для любых других начинающих Django/Python. Не забудьте добавить
import sys
и что-то вроде этого
print ("hello world") # python 3
sys.stdout.flush()
распечатает на консоль.
Переход с PHP на Py/Dj KISS может быть редким.