Поделиться через


Удаленная отладка кода Python в Linux в Visual Studio

В этой статье описано, как настроить установку Visual Studio для поддержки отладки кода Python на удаленных компьютерах Linux. Это пошаговое руководство основано на Visual Studio 2019 версии 16.6.

Visual Studio может запускать и отлаживать приложения Python локально и удаленно на компьютере Windows. Visual Studio также поддерживает удаленную отладку на другой операционной системе, устройстве или Python-реализации, отличной от CPython, с помощью библиотеки debugpy.

Visual Studio 2019 версии 16.4 и более ранних версий использует библиотеку ptvsd. В Visual Studio 2019 версии 16.5 и более поздних версиях библиотека debugpy заменяет ptvsd. При использовании debugpy код Python, отлаживаемый, размещает сервер отладки, к которому Visual Studio может подключиться. Для этого размещения требуется небольшое изменение кода для импорта и активации сервера. Также может потребоваться настроить конфигурации сети или брандмауэра на удаленном компьютере, чтобы разрешить TCP-подключения.

Необходимые условия

  • Visual Studio, установленный с поддержкой задач Python. Дополнительные сведения см. в статье Установка поддержки Python в Visual Studio.

  • Удаленный компьютер под управлением Python в операционной системе, например macOS или Linux.

  • Порт 5678 (входящий трафик) открыт на брандмауэре удаленного компьютера, который используется по умолчанию для удаленной отладки.

Настройка компьютера Linux

Вы можете легко создать виртуальную машину Linux в Azure и получить доступ к ней с помощью удаленного рабочего стола из Windows. Ubuntu для виртуальной машины удобно, так как Python установлен по умолчанию. Если у вас другая конфигурация, ознакомьтесь с по установке интерпретаторов Python для информации о других местах загрузки Python.

Настройка брандмауэра

Входящий порт 5678 должен быть открыт на брандмауэре удаленного компьютера для поддержки удаленной отладки.

Дополнительные сведения о создании правила брандмауэра для виртуальной машины Azure см. в следующих статьях:

Подготовка скрипта для отладки

Выполните следующие действия, чтобы подготовить скрипт для отладки кода Python в Linux.

  1. На удаленном компьютере создайте файл Python с именем guessing-game.py со следующим кодом:

    import random
    
    guesses_made = 0
    name = input('Hello! What is your name?\n')
    number = random.randint(1, 20)
    print('Well, {0}, I am thinking of a number between 1 and 20.'.format(name))
    
    while guesses_made < 6:
        guess = int(input('Take a guess: '))
        guesses_made += 1
        if guess < number:
            print('Your guess is too low.')
        if guess > number:
            print('Your guess is too high.')
        if guess == number:
            break
    if guess == number:
        print('Good job, {0}! You guessed my number in {1} guesses!'.format(name, guesses_made))
    else:
        print('Nope. The number I was thinking of was {0}'.format(number))
    
  2. Установите пакет debugpy в среду с помощью команды pip3 install debugpy.

    Заметка

    Рекомендуется записать версию debugpy, установленную в случае, если это необходимо для устранения неполадок. В списке debugpy также отображаются доступные версии.

  3. Включите удаленную отладку, добавив следующий код в верхней части файла guessing-game.py перед другим кодом. (Хотя и не является строгим требованием, невозможно выполнить отладку фоновых потоков до вызова функции listen.)

    import debugpy
    debugpy.listen(('0.0.0.0', 5678))
    
  4. Сохраните файл и запустите программу:

    python3 guessing-game.py
    

    Вызов функции listen выполняется в фоновом режиме и ожидает входящих подключений в процессе работы с программой. При желании можно вызвать функцию wait_for_client после вызова функции listen, чтобы заблокировать программу до подключения отладчика.

Совет

Помимо функций listen и wait_for_client, debugpy также предоставляет вспомогательные функции breakpoint. Эта функция служит программной точкой останова, если отладчик подключен. Другая функция, is_client_connected1, возвращает True, если отладчик подключен. Перед вызовом других функций debugpy не нужно проверять этот результат.

Удаленное подключение через средства Python

Ниже показано, как задать точку останова для остановки удаленного процесса.

  1. Создайте копию удаленного файла на локальном компьютере и откройте его в Visual Studio. Это не имеет значения, где находится файл, но его имя должно соответствовать имени скрипта на удаленном компьютере.

  2. (Необязательно) Чтобы иметь IntelliSense для debugpy на локальном компьютере, установите пакет debugpy в среду Python.

  3. Выберите Отладка>Подключение к процессу.

  4. В диалоговом окне Присоединение к процессу задайте для Python удаленного (debugpy)тип подключения.

  5. В поле целевого объекта подключения введите команду tcp://<ip_address>:5678.

    • tcp:// указывает тип подключения как Протокол управления передачей данных (TCP).
    • <ip_address> — это IP-адрес удаленного компьютера, который может быть явным адресом или именем, например myvm.cloudapp.net.
    • :5678 — это номер порта удаленной отладки.
  6. Выберите и нажмите клавишу Enter, чтобы заполнить список доступных процессов debugpy на этом компьютере.

    снимок экрана, показывающий, как ввести целевой объект подключения, чтобы просмотреть список доступных процессов отладки.

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

  7. Выберите процесс для отладки и выберите Подключитьили дважды щелкните по процессу.

  8. Visual Studio переключается в режим отладки, пока скрипт продолжает работать на удаленном компьютере, предоставляя все обычные возможности отладки.

    Можно задать точку останова в строке if guess < number:, затем переключиться на удаленный компьютер и ввести другое предположение. Visual Studio на локальном компьютере останавливается в точке останова, отображает локальные переменные и т. д.

    снимок экрана, показывающий, как Visual Studio приостанавливает отладку при нажатии точки останова.

  9. При остановке отладки Visual Studio отсоединяется от программы. Программа продолжает работать на удаленном компьютере. debugpy также продолжает прослушивать присоединение отладчиков, поэтому вы можете повторно подключиться к процессу в любое время.

Устранение неполадок подключения

Ознакомьтесь со следующими точками, чтобы устранить неполадки с подключением.

  • Убедитесь, что для типа подключениявыбрана удаленная Python (debugpy).

  • Убедитесь, что секрет в подключении точно соответствует секрету в целевом объекте удаленного кода.

  • Убедитесь, что IP-адрес в целевом объекте подключения соответствует удаленного компьютера.

  • Убедитесь, что порт удаленной отладки на удаленном компьютере открыт, а целевой объект подключения включает суффикс порта, например :5678.

    Чтобы использовать другой порт, укажите номер порта в вызове функции listen, как в debugpy.listen((host, port)). В этом случае обязательно откройте конкретный порт в брандмауэре.

  • Убедитесь, что версия debugpy, установленная на удаленном компьютере (версия, возвращаемая командой pip3 list), соответствует версии Visual Studio Python Tools (PTVS).

    В следующей таблице перечислены допустимые пары версий. При необходимости обновите версию debugpy на удаленном компьютере.

    Visual Studio Средства Python debugpy
    2019 16.6 1.0.0b5 1.0.0b5
    2019 16.5 1.0.0b1 1.0.0b1

Заметка

Visual Studio 2019 версии 16.0-16.4 использует ptvsd, а не debugpy. Процесс, приведенный в этом пошаговом руководстве для этих версий, аналогичен, но имена функций отличаются. Visual Studio 2019 версии 16.5 использует debugpy, но имена функций совпадают с именами функций в ptvsd. Вместо listenвы будете использовать enable_attach. Вместо wait_for_clientвы будете использовать wait_for_attach. Вместо breakpointвы будете использовать break_into_debugger.

Используйте ptvsd 3.x для отладки в старом окружении

Устаревший отладчик ptvsd 3.x установлен по умолчанию в Visual Studio 2017 версии 15.7 и более ранних.

В зависимости от конфигурации Visual Studio может потребоваться использовать ptvsd 3.x для удаленной отладки:

  • Visual Studio 2017 версии 15.7 и более ранних версий с Python 2.6, 3.1 до 3.4 или IronPython
  • Visual Studio 2019 версии 16.5 и более поздних версий с Python 2.6, 3.1 до 3.4 или IronPython
  • Ранние версии 4.x

Если конфигурация реализует более старый сценарий версии, Visual Studio отображает ошибку, отладчик не поддерживает эту среду Python.

Настройка удаленной отладки

Чтобы подготовиться к удаленной отладке с помощью ptvsd 3.x, выполните следующие действия:

  1. Настройте секрет, который используется для ограничения доступа к выполняемому скрипту.

    В ptvsd 3.x функция enable_attach требует передачи "секрета" в качестве первого аргумента.

    • При присоединении удаленного отладчика введите секрет с помощью команды enable_attach(secret="<secret>").

    Хотя вы можете разрешить любому пользователю подключаться с помощью команды enable_attach(secret=None), этот параметр не рекомендуется.

  2. Создайте URL-адрес целевого объекта подключения в форме tcp://<secret>@<ip_address>:5678.

    • tcp:// указывает тип подключения в виде TCP.
    • <secret> — это строка, передаваемая с помощью функции enable_attach в коде Python.
    • <ip_address> — это IP-адрес удаленного компьютера, который может быть явным адресом или именем, например myvm.cloudapp.net.
    • :5678 — это номер порта удаленной отладки.

Безопасное подключение с помощью протокола TCPS

По умолчанию подключение к серверу удаленной отладки ptvsd 3.x защищено только секретом, и все данные передаются в виде обычного текста. Для более безопасного подключения ptvsd 3.x поддерживает протокол SSL, используя защищенную версию протокола TCP или TCPS.

Чтобы настроить ptvsd 3.x для работы с протоколом TCPS, выполните следующие действия.

  1. На удаленном компьютере используйте команду openssl для создания отдельных файлов для ключа и самозаверяющего сертификата:

    openssl req -new -x509 -days 365 -nodes -out cert.cer -keyout cert.key
    
    • В командной строке openssl введите имя узла или IP-адрес, который вы используете для подключения к Общему имени.

    Дополнительную информацию см. в самоподписанных сертификатах в документации модуля Python ssl. Обратите внимание, что команда, описанная в документации по Python, создает только один объединенный файл.

  2. В коде измените вызов функции enable_attach, чтобы включить certfile и keyfile аргументы с помощью имен файлов в качестве значений. Эти аргументы имеют то же значение, что и для стандартной функции Python ssl.wrap_socket.

    ptvsd.enable_attach(secret='my_secret', certfile='cert.cer', keyfile='cert.key')
    

    Вы также можете внести те же изменения в файл кода на локальном компьютере. Так как этот код на самом деле не выполняется, это не обязательно.

  3. Перезапустите программу Python на удаленном компьютере, чтобы она была готова к отладке.

  4. Защитить канал, добавив сертификат в доверенный корневой ЦС на компьютере Windows с помощью Visual Studio:

    1. Скопируйте файл сертификата с удаленного компьютера на локальный компьютер.

    2. Откройте Панель управления и перейдите к Средства Windows>Управление сертификатами компьютера.

    3. В диалоговом окне certlm [Сертификаты — локальный компьютер] разверните узел Доверенные корневые центры сертификации, щелкните правой кнопкой мыши Сертификатыи выберите Все задачи>Импорт.

    4. Перейдите и выберите файл .cer, скопированный с удаленного компьютера.

    5. Продолжайте работу с диалоговым окном, чтобы завершить процесс импорта.

  5. Повторите процесс подключения в Visual Studio, как описано ранее в удаленное подключение из средств Python.

    Для этого экземпляра определите tcps:// как протокол для целевого объекта подключения () или квалификатора ().

    снимок экрана, показывающий, как указать TCPS в качестве удаленного транспорта отладки с помощью SSL.

Устранение проблем с подключением

Во время попытки подключения Visual Studio может столкнуться с проблемами. Просмотрите следующие сценарии и при необходимости выполните соответствующие действия.

  • Visual Studio предупреждает о потенциальных проблемах с сертификатом при подключении по протоколу SSL.

    действие. Вы можете игнорировать сообщение и продолжить.

    Осторожность

    Имейте в виду, что, хотя канал по-прежнему шифруется для защиты от перехвата, он может быть уязвим для атак типа "человек посередине".

  • Visual Studio отображает предупреждение "удаленный сертификат не является доверенным".

    проблема: Сертификат неправильно добавлен в доверенный корневой центр сертификации.

    действие. Перепроверьте шаги, чтобы добавить сертификат в доверенные корневые ЦС на компьютере Windows, и повторите попытку подключения.

    снимок экрана: предупреждение о том, что удаленный SSL-сертификат не является доверенным.

  • Visual Studio отображает предупреждение о том, что имя удаленного сертификата не соответствует имени узла.

    Проблема: Не указано правильное имя узла или IP-адрес для Общего имени сертификата.

    Действие: Перепроверьте этапы из "Защита подключения с помощью TCPS". Не забудьте использовать правильное Общее имя при создании сертификата и попробуйте подключиться снова.

    снимок экрана: предупреждение о том, что удаленный SSL-сертификат не соответствует имени узла.