Есть ли "Редактировать и продолжить" в PyCharm? Перезагрузите код в запущенную программу, например, в Eclipse/PyDev?
Привет всем разработчикам Python!
В Eclipse с PyDev можно редактировать файл Python во время отладки. При сохранении отладчик PyDev перезагрузит обновленный код в запущенную программу и использует мой новый код. Как я могу сделать то же самое в JetBrains PyCharm (используя Community Edition)?
Eclipse/PyDev записывает такой вывод, когда я это делаю:
pydev debugger: Start reloading module: "MyWidget" ...
pydev debugger: Updated function code: <function close at 0x055F4E70>
pydev debugger: reload finished
Я искал настройки и сеть и не мог найти подсказок. Очень рад любой идее. спасибо.
Изменить: я обнаружил, что в Eclipse/PyDev вы должны быть в режиме отладки, чтобы иметь возможность использовать эту функцию. Я тестировал в PyCharm, но перезагрузки не было.
Ответы
Ответ 1
В конце концов, я нашел полезное и приемлемое обходное решение для моего вопроса. Он работает в PyCharm Community Edition 3.1.2, и я предполагаю, что это будет делать и в коммерческом издании. Я тестировал в среднем проекте, используя Python 2.7.6, PySide (Qt) с одним основным окном и 20 + виджетами, вкладками, что угодно. Выполните следующие шаги...
- Работа в Pycharm по проекту python: -)
- Выполнить свой код в режиме отладки (пока не пробовал Release)
- Отредактируйте код в одном из ваших модулей, импортированных в течение жизни вашей программы.
- Сделайте паузу в программе. Для этого вы можете нажать кнопку "Пауза" в представлении PyCharms Debug, а затем любое место в главном окне приложения, где ему нужно что-то сделать (например, в заголовке вкладки). Если у вас долго работающая задача и нет пользовательского интерфейса, вы можете разместить точку останова в месте, где часто приходит ваша программа.
- В представлении "Отладка" перейдите на вкладку Консоль. На левой панели находится кнопка Показать командную строку. Нажмите здесь.
- В консоли введите перезагрузить (MyModifiedModule), если этот вызов завершился с ошибкой, напишите импортировать MyModifiedModule и повторите попытку.
- Нажмите "Обновить" в PyCharm.
- Попробуйте установить код.
![PyCharm Debug View]()
Есть некоторые ограничения на это... Он не будет исправлять изменения в вашем основном методе или главном окне, потому что он не будет создан снова. В моих тестах я не мог перезагрузить виджеты из Qt. Но он работал для классов, таких как контейнеры данных или рабочие.
Пусть сила будет с вами, когда вы попробуете это, и не стесняйтесь добавлять свои впечатления.
Спасибо.
Ответ 2
PyCharm не поддерживает редактирование и продолжается либо в редакции сообщества, либо в профессиональной версии, но вот обходной путь, который я нашел во время отладки.
Поскольку вы можете запускать произвольный код в консоли и/или оценщик выражения, во многих случаях вы можете выполнять изменения кода без перезапуска приложения. Это не совсем так, как edit-and-continue (это функция, которая мне действительно нравится в Visual Studio и должна быть частью Pycharm), но это долгий путь к тому, чтобы не перезапускать программу с нуля после изменения, чтобы увидеть, новый код работает так, как ожидалось.
Позвольте мне проиллюстрировать пару методов, которые я использую:
Скажем, у вас есть следующий код (с несколькими опечатками/ошибками для иллюстрации техник)
test_value = [10,9,8,7,6,55,4,3,2,1]
for i in range(0,10):
if test_value[i] == i:
print "found the value: " + i
Если вы запустите этот код, сначала он ошибется, потому что вы не можете печатать строку плюс целое число, но также я хотел совпадение на 5, а не 55 в массиве. Итак, идем.
Установите точку останова в инструкции for, как это, и запустите код в отладчике.
![enter image description here]()
Когда он разбивается на отладчик, вы понимаете, что это должно быть не 5, а не 55. Вместо перезапуска вы можете изменить строку 1 на test_value = [10,9,8,7,6,5,4, 3,2,1], затем выберите строку, щелкните правой кнопкой мыши и выберите Execute Line in Console..., которая изменит значение test_value на массив с параметром 5. Теперь оператор if в строке 4 станет true на значении 5. Затем будет инициирована синтаксическая ошибка в строке 5.
Теперь, если вы хотите убедиться, что у вас правильный синтаксис, вы можете изменить строку 5 на print "найденное значение:" + str (i), выберите строку и выберите "Выделить выражение". из контекстного меню правой кнопки. Когда вы нажмете "Вычислить", результат появится либо в диалоговом окне (или в этом случае, так как это команда печати, на консоли).
![enter image description here]()
Теперь, когда я исправил эти две проблемы, я могу успешно запустить код на втором проходе, а не, возможно, несколько проходов, которые он мог бы сделать, если бы я не использовал эти методы. Эти методы действительно окупаются, если вы обнаружите ошибку в коде, где требуется некоторое время, чтобы настроить.
Очевидно, что это очень надуманный пример, но, надеюсь, это показывает, как вы можете использовать как Evaluate Expression..., так и Execute Line in Console... в ваших интересах при отладке без перезапуска приложения каждый раз, когда вы находите ошибка в коде.
Кроме того, если вы используете Django, PyCharm (профессиональный) перезапустит сервер, если вы внесете изменения в код. Поэтому, если вы смотрите на свою веб-страницу и замечаете проблему, вы можете внести изменения в код и вернуться на веб-страницу, и, как вы это делаете, перезапустимое запущенное приложение или отлаживаемое приложение перезагрузится, а новый код будет запущен при обновлении страницы. Опять же, на самом деле не редактируйте и не продолжайте, но довольно быстрый способ внести изменения и протестировать.
Ответ 3
У меня есть коммерческая версия PyCharm и просто попробовал протестировать простой python script. script:
for i in range(0,100):
print i
Я запустил код в режиме отладки и разместил точку прерывания в инструкции "print i". Когда отладчик остановился во время первой итерации, я изменил код, чтобы выглядеть так:
for i in range(0,100):
print i
print 'hello'
PyCharm не перезагружает/не компилирует измененный script. Учитывая этот простой тест, лучше всего предположить, что PyCharm не динамически перезагружает .py файлы.