Как запустить удаленную отладку с помощью PyCharm? - PullRequest
46 голосов
/ 09 августа 2011

Я пытаюсь выполнить отладку между 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

Пока Пичарм просто сидел, "ожидая соединения"

Ответы [ 3 ]

106 голосов
/ 15 августа 2011

PyCharm (или ваш идеал выбора) действует как «сервер», а ваше приложение - как «клиент»;поэтому сначала вы запускаете сервер - скажите IDE «отладить» - затем запустите клиент - это некоторый код с оператором 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

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

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

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

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

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

  • Выполнить -> Редактировать конфигурации : открывает диалоговое окно «Run / Debug Configurations»
  • Defaults -> «Python Remote Debug»: это шаблон для использования
  • для заполнения имени локального хоста и портаи вы, вероятно, захотите «использовать сопоставление путей», но об этом подробнее рассказано ниже ...
  • "ОК"

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

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

    Пока не беспокойтесь о путевых отображениях.

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

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

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

 Starting debug server at port 21000

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

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

Это работает внутри модульного теста:

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 менее проблематично, чем настройки по умолчанию, не только немедленно останавливает работу, поэтому вы не уверены, работает ли он, но также пытаетесь выполнить потоковую передачу на стандартный вывод / вывод, что также может вызвать у вас горе.

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

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

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

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

После всего этого, когда все пойдет по плану, вы можете установить точку останова - где-нибудь после того, как settrace запустится - и консоль 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

Готово.

9 голосов
/ 16 августа 2016

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

  1. Прямо сейчас pip install pydevd работал для меня как на Ubuntu, так и Centos 6
  2. Если вы хотите действительно отладить удаленный сервер, который находится за брандмауэрами и т. Д., Вы можете использовать следующий трюк:

ssh -R 8081: локальный хост: 8081 user@remote-server.com

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

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

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

...