Автозагрузка пирамиды и фляжки и точки останова не работают

Я использую Pycharm 4, с колбой 0.10.1, Python 3.4

Кажется, что при запуске приложения фляги из Pycharm, если я запускаю его с:

app.run(debug=True)

Мои точки останова игнорируются. После некоторого поиска в Google я обнаружил, что для остановки PyCharm на точках останова я должен запустить флягу с:

app.run(debug=True, use_reloader=False)

Теперь PyCharm правильно останавливается на точках останова, но мне не хватает функции автозагрузки.

Есть ли способ заставить оба работать вместе?

Используя python 2.7 обе вещи работают

Я сообщил об этом PyCharm: https://youtrack.jetbrains.com/issue/PY-13976

Ответ 1

Я собираюсь начать с короткого ответа: Нет, то, что вы хотите, не может быть сделано с любыми версиями PyCharm до 4.0.1.

Проблема заключается в том, что при использовании перегружателя приложение Flask выполняется в дочернем процессе, поэтому отладчик PyCharm подключается к основному процессу и не имеет контроля над дочерним элементом.

Лучший способ решить эту проблему, на мой взгляд, - попросить Jetbrains создать функцию "перезагрузки при изменении" в своей среде IDE. Тогда вам не нужно использовать перезагрузку Werkzeug вообще, и вы получаете ту же функциональность, что и PyCharm.

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

  • В "Редактировании конфигураций" установите конфигурацию, которую вы собираетесь использовать, только "Single Instance" (флажок в правом верхнем углу диалогового окна).
  • Убедитесь, что конфигурация является активной.
  • Настройте приложение Flask, чтобы не использовать перезагрузку Werkzeug.
  • Нажмите Ctrl-D, чтобы начать отладку (на Mac, другие могут иметь разные ярлыки)
  • Точки останова должны работать нормально, потому что перезагрузчик неактивен.
  • Внесите необходимые изменения кода.
  • Когда вы будете готовы к перезапуску, снова нажмите Ctrl-D. В первый раз, когда вы это сделаете, вы получите подсказку с подтверждением, что-то вроде "stop and restart?". Скажите "да" и установите флажок "Не показывать снова".
  • Теперь вы можете нажать Ctrl-D, чтобы быстро перезапустить отладчик, когда вам нужно.

Я согласен, что это не идеально, но как только Ctrl-D попадает в вашу мышечную память, вы даже не подумаете об этом.

Удачи!

Ответ 2

Проблема заключается в том, что при use_reloader=True приложение werkzeug запускается в отдельном (дочернем) потоке основного приложения, а PyCharm не может правильно обрабатывать точки останова, потому что они теряются при запуске потока.

Вы можете попробовать следовать этой теме: http://forum.jetbrains.com/thread/PyCharm-776, но это швы там не было слишком большого прогресса.

Я бы предложил использовать что-то Python-ish как pdb, то есть:

@app.route('/<string:page>')
def main(page):
   import pdb; pdb.set_trace()  # This line actually stops application execution
                                # and starts Python debug shell in the console
                                # where you can examine current scope and continue
                                # normal code execution at any time.
                                # You can inject *any* code here.
                                # For example, if you type `print page` during pause,
                                # it will output content of "page" variable.
   return render_template('index.html')

Ответ 3

Я обнаружил, что в PyCharm 2018.1.2 есть проверочная коробка FLASK_DEBUG в конфигурации запуска: enter image description here

При этом после внесения некоторых изменений сохранение файла вызывает действие перезагрузки.

Ответ 4

Попробуйте настроить эту рабочую конфигурацию Python в "Редактировать конфигурации". После этого запустите в режиме отладки.

Example

Ответ 5

В моей настройке я отлаживаю приложение фляги, запустив файл main.py который устанавливает некоторую конфигурацию и вызывает app.run(). Мой интерпретатор Python настроен в контейнере Docker.

Моя проблема заключалась в том, что мне нужно было проверить Run with Python console.

Ответ 6

от pycharm 2017 с использованием python 2.7 (в моем случае с виртуальным env, но я не думаю, что это необходимо):

  • бежать...
  • оставить сценарии и параметры сценариев пустыми
  • Я использую опции интерпретатора: -m flask run
  • установить переменные env FLASK_APP

  • чем выполнить прикрепление к локальному процессу и, наконец, выбрать выполняемый процесс

Моим вариантом использования является подключение из почтовых сообщений к конечным точкам обслуживания ловушек и прерывание на моих контрольных точках