Удаленная отладка кода 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 см. в следующих статьях:
- Фильтровать сетевой трафик с помощью группы безопасности сети с помощью портала Azure
- Маршрутизация сетевого трафика с таблицей маршрутов с помощью портала Azure
- Развертывание и настройка брандмауэра Azure с помощью портала Azure
Подготовка скрипта для отладки
Выполните следующие действия, чтобы подготовить скрипт для отладки кода Python в Linux.
На удаленном компьютере создайте файл 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))
Установите пакет
debugpy
в среду с помощью командыpip3 install debugpy
.Заметка
Рекомендуется записать версию debugpy, установленную в случае, если это необходимо для устранения неполадок. В списке debugpy также отображаются доступные версии.
Включите удаленную отладку, добавив следующий код в верхней части файла guessing-game.py перед другим кодом. (Хотя и не является строгим требованием, невозможно выполнить отладку фоновых потоков до вызова функции
listen
.)import debugpy debugpy.listen(('0.0.0.0', 5678))
Сохраните файл и запустите программу:
python3 guessing-game.py
Вызов функции
listen
выполняется в фоновом режиме и ожидает входящих подключений в процессе работы с программой. При желании можно вызвать функциюwait_for_client
после вызова функцииlisten
, чтобы заблокировать программу до подключения отладчика.
Совет
Помимо функций listen
и wait_for_client
, debugpy также предоставляет вспомогательные функции breakpoint
. Эта функция служит программной точкой останова, если отладчик подключен. Другая функция, is_client_connected1
, возвращает True
, если отладчик подключен. Перед вызовом других функций debugpy
не нужно проверять этот результат.
Удаленное подключение через средства Python
Ниже показано, как задать точку останова для остановки удаленного процесса.
Создайте копию удаленного файла на локальном компьютере и откройте его в Visual Studio. Это не имеет значения, где находится файл, но его имя должно соответствовать имени скрипта на удаленном компьютере.
(Необязательно) Чтобы иметь IntelliSense для debugpy на локальном компьютере, установите пакет debugpy в среду Python.
Выберите Отладка>Подключение к процессу.
В диалоговом окне Присоединение к процессу задайте для Python удаленного (debugpy)тип подключения.
В поле целевого объекта подключения введите команду
tcp://<ip_address>:5678
.-
tcp://
указывает тип подключения как Протокол управления передачей данных (TCP). -
<ip_address>
— это IP-адрес удаленного компьютера, который может быть явным адресом или именем, например myvm.cloudapp.net. -
:5678
— это номер порта удаленной отладки.
-
Выберите и нажмите клавишу Enter, чтобы заполнить список доступных процессов debugpy на этом компьютере.
Если вы начнете другую программу на удаленном компьютере после заполнения этого списка, нажмите кнопку Обновить.
Выберите процесс для отладки и выберите Подключитьили дважды щелкните по процессу.
Visual Studio переключается в режим отладки, пока скрипт продолжает работать на удаленном компьютере, предоставляя все обычные возможности отладки.
Можно задать точку останова в строке
if guess < number:
, затем переключиться на удаленный компьютер и ввести другое предположение. Visual Studio на локальном компьютере останавливается в точке останова, отображает локальные переменные и т. д.При остановке отладки 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, выполните следующие действия:
Настройте секрет, который используется для ограничения доступа к выполняемому скрипту.
В ptvsd 3.x функция
enable_attach
требует передачи "секрета" в качестве первого аргумента.- При присоединении удаленного отладчика введите секрет с помощью команды
enable_attach(secret="<secret>")
.
Хотя вы можете разрешить любому пользователю подключаться с помощью команды
enable_attach(secret=None)
, этот параметр не рекомендуется.- При присоединении удаленного отладчика введите секрет с помощью команды
Создайте 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, выполните следующие действия.
На удаленном компьютере используйте команду
openssl
для создания отдельных файлов для ключа и самозаверяющего сертификата:openssl req -new -x509 -days 365 -nodes -out cert.cer -keyout cert.key
- В командной строке
openssl
введите имя узла или IP-адрес, который вы используете для подключения к Общему имени.
Дополнительную информацию см. в самоподписанных сертификатах в документации модуля Python
ssl
. Обратите внимание, что команда, описанная в документации по Python, создает только один объединенный файл.- В командной строке
В коде измените вызов функции
enable_attach
, чтобы включитьcertfile
иkeyfile
аргументы с помощью имен файлов в качестве значений. Эти аргументы имеют то же значение, что и для стандартной функции Pythonssl.wrap_socket
.ptvsd.enable_attach(secret='my_secret', certfile='cert.cer', keyfile='cert.key')
Вы также можете внести те же изменения в файл кода на локальном компьютере. Так как этот код на самом деле не выполняется, это не обязательно.
Перезапустите программу Python на удаленном компьютере, чтобы она была готова к отладке.
Защитить канал, добавив сертификат в доверенный корневой ЦС на компьютере Windows с помощью Visual Studio:
Скопируйте файл сертификата с удаленного компьютера на локальный компьютер.
Откройте Панель управления и перейдите к Средства Windows>Управление сертификатами компьютера.
В диалоговом окне certlm [Сертификаты — локальный компьютер] разверните узел Доверенные корневые центры сертификации, щелкните правой кнопкой мыши Сертификатыи выберите Все задачи>Импорт.
Перейдите и выберите файл .cer, скопированный с удаленного компьютера.
Продолжайте работу с диалоговым окном, чтобы завершить процесс импорта.
Повторите процесс подключения в Visual Studio, как описано ранее в удаленное подключение из средств Python.
Для этого экземпляра определите
tcps://
как протокол для целевого объекта подключения () или квалификатора ().
Устранение проблем с подключением
Во время попытки подключения Visual Studio может столкнуться с проблемами. Просмотрите следующие сценарии и при необходимости выполните соответствующие действия.
Visual Studio предупреждает о потенциальных проблемах с сертификатом при подключении по протоколу SSL.
действие. Вы можете игнорировать сообщение и продолжить.
Осторожность
Имейте в виду, что, хотя канал по-прежнему шифруется для защиты от перехвата, он может быть уязвим для атак типа "человек посередине".
Visual Studio отображает предупреждение "удаленный сертификат не является доверенным".
проблема: Сертификат неправильно добавлен в доверенный корневой центр сертификации.
действие. Перепроверьте шаги, чтобы добавить сертификат в доверенные корневые ЦС на компьютере Windows, и повторите попытку подключения.
Visual Studio отображает предупреждение о том, что имя удаленного сертификата не соответствует имени узла.
Проблема: Не указано правильное имя узла или IP-адрес для Общего имени сертификата.
Действие: Перепроверьте этапы из "Защита подключения с помощью TCPS". Не забудьте использовать правильное Общее имя при создании сертификата и попробуйте подключиться снова.