Подтвердить что ты не робот

Как запустить удаленную отладку с помощью PyCharm?

Я пытаюсь получить отладку между PyCharm (на хосте Windows) и виртуальным хостом debian, запускающим приложение django. Инструкции говорят, чтобы установить яйцо, добавить импорт, а затем вызвать команду. Я предполагаю, что эти вещи нужно делать на хозяине debian?

Итак, в каком файле я должен помещать эти две строки?

from pydev import pydevd
pydevd.settrace('not.local', port=21000, stdoutToServer=True, stderrToServer=True)

Я попытался поместить его в settings.py, но получил такую ​​вещь...

File "/django/conf/__init__.py", line 87, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
File "/django/utils/importlib.py", line 35, in import_module
    __import__(name)
File "/settings.py", line 10, in <module>
    pydevd.settrace('dan.local', port=21000, stdoutToServer=True, stderrToServer=True)
File "/pycharm-debug.egg/pydev/pydevd.py", line 1079, in settrace
    debugger.connect(host, port)
File "/pycharm-debug.egg/pydev/pydevd.py", line 241, in connect
    s = StartClient(host, port)
File "/pycharm-debug.egg/pydev/pydevd_comm.py", line 362, in StartClient
    sys.exit(1)
SystemExit: 1

В то время как pycharm просто сидел там "ожидая подключения"

4b9b3361

Ответ 1

PyCharm (или ваш идеал выбора) действует как "сервер", и ваше приложение является "клиентом"; поэтому сначала запустите сервер - сообщите IDE "debug" - затем запустите клиент - это какой-то код с инструкцией settrace в нем. Когда ваш код python попадает в settrace, он подключается к серверу - pycharm - и начинает подавать ему данные отладки.

Чтобы это произошло:

1. скопируйте библиотеку pydev на удаленную машину

Поэтому мне пришлось скопировать файл из C:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.egg в мою Linux-машину. Я положил его на /home/john/api-dependancies/pycharm-debug.egg

2. Поместите яйцо в PYTHONPATH

Надеюсь, вы поймете, что не сможете использовать яйцо, если python не сможет его найти. Я думаю, что большинство людей используют easy_install, но в моем экземпляре я добавил его явно, поставив это:

   import sys
   sys.path.append('/home/john/app-dependancies/pycharm-debug.egg')

Это необходимо только потому, что я все еще не успел установить яйцо. Это мое решение.

3. настройка конфигурации сервера отладки

В PyCharm вы можете настроить сервер отладки с помощью:

  • Run- > Edit Configurations: открывает диалоговое окно "Run/Debug Configurations"
  • По умолчанию → "Удаленная отладка Python": это шаблон для использования
  • заполните имя и порт локального хоста, и вы, вероятно, захотите "использовать сопоставление маршрутов", но более подробно обо всем этом ниже...
  • "OK"

    Локальное имя узла: означает имя сервера - то, что хост-компьютер Windows в моем случае - или фактически IP-адрес хост-машины Windows, поскольку имя хоста неизвестно моей удаленной машине, Таким образом, виртуальный (удаленный) компьютер должен иметь возможность доступа к хосту. ping и netstat хороши для этого.

    Порт: может быть любым свободным непривилегированным портом, который вам нравится. например: 21000 вряд ли будет использоваться.

    Не беспокойтесь о сопоставлениях пути на данный момент.

4. Запустите сервер отладки

  • Run- > Debug: запустите сервер отладки - выберите конфигурацию, которую вы только что создали.

Появится вкладка консоли отладки, и вы должны получить

 Starting debug server at port 21000

в консоли, что означает, что сервер отладки ide ожидает, что ваш код откроет для него соединение.

5. Вставьте код

Это работает внутри unit test:

from django.test import TestCase
class APITestCase(TestCase):
    def test_remote_debug(self):
        import sys
        sys.path.append('/home/john/dependancies/pycharm-debug.egg')
        from pydev import pydevd
        pydevd.settrace('192.168.33.1', port=21000, suspend=False)

        print "foo"

И в веб-приложении django это немного похоже на то, куда вы его поместили, - кажется, работает только после того, как все остальное сделано:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

    sys.path.append('/vagrant/pycharm-debug.egg')
    import pydevd
    pydevd.settrace('192.168.33.1', port=21000, suspend=False)

Опять же, что IP-адрес - это поле, в котором вы запускаете Pycharm; вы должны иметь возможность пинговать этот IP-адрес из коробки, на которой запущен ваш код/​​веб-сайт. Порт - это ваш выбор, просто убедитесь, что вы сказали pycharm слушать в том же порту. И я обнаружил, что suspend=False менее проблематичен, чем значения по умолчанию, а не только сразу же останавливаются, поэтому вы не уверены, что он работает, но также пытается передать поток stdin/out, который также может дать вам печаль.

6. Откройте брандмауэр

Брандмауэр Windows 7 по умолчанию заблокирует ваше входящее соединение. Используя netstat на удаленном хосте, вы сможете увидеть, что SYN_SENT никогда не становится ESTABLISHED, по крайней мере, пока вы не добавите исключение из брандмауэра Windows для приложения "pycharm".

OS/X и Ubuntu не имеют брандмауэров, чтобы бросить бросок (по умолчанию кто-то мог применить его позже).

7. Установите точку останова и запустите код

После всего этого, когда все идет по плану, вы можете установить точку останова - где-то после того, как будет выполнена настройка, - и консоль pycharm покажет

Connected to pydev debugger (build 107.386)

а на вкладке "Отладчик" начнет работать стек переменных, и вы можете пройти через код.

8. Отображения

Отображение подсказки в pycharm, где он может найти исходный код. Поэтому, когда отладчик говорит: "Я запускаю строку 393 файла /foo/bar/nang.py, Pycharm может перевести этот удаленный абсолютный путь в абсолютный локальный путь... и показать вам исходный код.

/Users/john/code/app/    /opt/bestprice/app/
/Users/john/code/master/lib    /opt/bestprice/lib/python2.7/site-packages

Готово.

Ответ 2

Это просто заметка, на самом деле, но содержит некоторую информацию, которая может сэкономить часы.

  • Прямо сейчас pip install pydevd работал на меня как на ubuntu, так и на centos 6
  • Если вы хотите действительно отлаживать удаленный сервер, который находится за firewals и прочее, вы можете использовать следующий трюк:

ssh -R 8081: localhost: 8081 [email protected]

это позволяет удаленному коду подключаться к вашему компьютеру при прослушивании на localhost: 8081

  1. Если удаленный отладчик не хочет запускаться, заявив, что он не может найти порт сокета, проверьте правила брандмауэра. Обратите внимание, что правило с "127.0.0.1" не совпадает с "localhost".

Ответ 3

Похоже, что по какой-то причине отладчик не смог подключиться к вашему хосту Windows с помощью PyCharm. У вас нет других сообщений в stderr? Если вы этого не сделали, попробуйте запустить его еще раз, но с sterrToServer = false. Это может показать истинную причину, по которой он не подключается.