Удаленная отладка PyCharm - подключается, но не может запускать отладку
Основы:
- У меня есть проект django, который работает нормально (как локально, так и на удаленном сервере).
-
Я запускаю pycharm локально с использованием профиля "удаленной отладки", и он выглядит отлично.
Starting debug server at port 4000
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('<my local machines public ip addr>', port=4000, suspend=False)
Waiting for connection...
-
На удаленном сервере я поместил соответствующий вызов в pycharm-debug.egg в __init__.py
(но я тоже попытался поместить его в другие места в коде).
-
Я запускаю удаленный сервер, как этот python manage.py runserver <remote domain name>:8000
а на локальном IDE/отладчике pycharm я вижу:
"Connected to pydev debugger (build 133.1347)"
-
После этого вещи просто сидят там... Я не получаю никакой обратной связи о том, где выполняется, и нет возможности в IDE pycharm "запускать/продолжать/запускать" что угодно.
-
На удаленном сервере, если я <ctrl-c>
, я вижу:
File "/<path here>/pycharm-debug.egg/pydevd.py", line 1256, in settrace
File "/<path here>/pycharm-debug.egg/pydevd.py", line 1305, in _locked_settrace
Я предполагаю, что все связано правильно, но я не вижу способа запустить все, что работает. У меня есть "suspend = False", поэтому я ожидал, что это начнется. Когда я пытаюсь открыть страницу на удаленном сервере, я получаю "не подключен", поэтому веб-сервер, очевидно, еще не работает (если curl http://<remote server domain>:8000
я получаю curl: (7) Failed connect to <remote server domain>:8000; Connection refused
). Без удаленной отладки это работает отлично на моей локальной машине или на удаленном сервере.
Что я делаю не так? :) Благодарю!
Детали:
-
На удаленном сервере, на котором выполняется код/процесс, я хочу отлаживать основной __init__.py
меня есть:
import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR + '/pycharm-debug.egg')
import pydevd
pydevd.settrace('<my local machines public ip addr>', port=4000, suspend=False)
-
Локальная среда IDE показывает:
Starting debug server at port 4000
Use the following code to connect to the debugger:
import pydevd
pydevd.settrace('localhost', port=4000, suspend=False) (tried with <public ip addr> for this, too.
Waiting for connection...
---- and then, after I start the remote server process: ----
Connected to pydev debugger (build 133.1347)
Другие примечания:
- Я пробовал это как с виртуальным сервером, так и без него на удаленном сервере.
- Я запускаю локальную среду разработки pycharm за обычным маршрутизатором кабельного модема Comcast с переадресацией портов для подключения порта 4000 (и протестировал это с помощью сервера узлов, подключенного к порту 4000, который отлично работал, когда я сделал wget против него с моего удаленного сервера).
Я в недоумении о том, как "поднять" что угодно, чтобы заставить все работать и позволить мне начать отладку.
Спасибо, что пытались помочь.
Ответы
Ответ 1
Для будущих гуглеров... Я смог получить удалённую отладку, но не с помощью этого метода. Я просто ответил на подобный вопрос об этом на форумах pycharm, поэтому подумал, что обновляю этот вопрос с помощью метода, который работал для меня.
- Перейдите в "PyCharm/Preferences/Project Interpreter".
- Вы увидите вариант выбора интерпретатора python в верхней части диалогового окна. Рядом находится значок шестеренки. Если вы нажмете на значок шестеренки, вы увидите вариант "Добавить удаленный доступ"... вы дадите ему учетные данные ssh (или путь к ssh-ключам) и путь туда, где ваш интерпретатор python установлен на удаленном сервере (т.е.,
/usr/local/bin/python
). - Кроме того, для меня "путь помощников pycharm" был (
/home/<username>/.pycharm_helpers
- я не могу вспомнить, было ли это создано автоматически или нет).
-
Перейдите в "Run/Edit Configurations..." и добавьте "Django Server" (плюс знак в левом верхнем углу диалога).
- Выберите новый интерпретатор удаленного python в качестве используемого интерпретатора (он должен отображаться в раскрывающемся списке вариантов).
- В разделе "env vars" мне нужно было указать файл настроек основного приложения (т.
DJANGO_SETTINGS_MODULE = <app>/settings.py
). Для моих целей мне также нужно было установить HTTPS=1
. - Установите рабочий каталог везде, где ваш проект django находится на удаленном сервере (например,
/home/<username>/<xyz>/<appdir>
). -
Установите сопоставления пути из локального /Users/JohnQ/<xyz>/<appdir>=/home/<username>/<xyz>/<appdir>
в удаленный /Users/JohnQ/<xyz>/<appdir>=/home/<username>/<xyz>/<appdir>
(т. /Users/JohnQ/<xyz>/<appdir>=/home/<username>/<xyz>/<appdir>
).
-
Поскольку мне нужны другие сторонние серверы (например, FB и т.д.), Чтобы иметь возможность ударить по этому серверу с помощью HTTPS, я использовал "stunnel" на удаленном сервере - его было довольно легко настроить).
-
В дополнение к этому, удобная задача - установить подтверждение развертывания, чтобы вы могли просто щелкнуть правой кнопкой мыши, чтобы загрузить более новые версии вашего файла (в разделе "Инструменты/Развертывание/Конфигурации...").
- Создайте новый, и при подключении используйте только ssh-кредиты или путь к вашим ключам.
- На вкладке сопоставлений пути такие же, как и для сопоставлений пути для настройки удаленного сервера.
- "Веб-путь на сервере" был для меня "
/
". После его создания вы можете просто щелкнуть правой кнопкой мыши по любому файлу/директории и выбрать "Загрузить в...". Обратите внимание, что для начальной загрузки я просто scp'd tar.gz до моего сервера, чтобы сэкономить время, и я только загружаю через конфигурацию развертывания изменения, которые я делаю во время отладки.
Я с удовольствием использовал это для удаленной отладки для ~ 4 мс, поэтому он отлично работает.
Ответ 2
У меня были те же симптомы и "исправлены", отключив все точки останова исключения Python в окне "Просмотр точек останова".
Ответ 3
Для меня это suspend=False
параметр suspend=False
.
Документы говорят, что @param suspend: whether a breakpoint should be emulated as soon as this function is called.
,
Если вы позволите ему туда, он соединяется, но не рассматривает точку останова. Затем вы должны в основном использовать другой pydevd.settrace('ip.addr')
→ уведомление о suspend
Ответ 4
Мне пришлось отключить автоперегрузчик, чтобы исправить это:
./manage.py runserver --noreload