Удаленная отладка кода 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 на базе операционной системы, такой как Mac OSX или 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
команды.Включите удаленную отладку, добавив следующий код в верхней части файла 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
. Эта функция служит программной точкой останова, если отладчик подключен. Другая функция возвращаетсяTrue
, is_client_connected1
если отладчик подключен. Перед вызовом других debugpy
функций вам не нужно проверка этот результат.
Удаленное подключение с помощью инструментов Python
Ниже показано, как задать точку останова для остановки удаленного процесса.
Скопируйте удаленный файл на локальный компьютер и откройте его в Visual Studio. Вы можете разместить этот файл в любом каталоге, но его имя должно совпадать с именем скрипта на удаленном компьютере.
Чтобы технология IntelliSense для debugpy работала на локальном компьютере, установите пакет debugpy в среде Python (необязательно).
Выберите Отладка>Присоединение к процессу.
В диалоговом окне "Присоединение к процессу" задайте для параметра "Тип Подключение ion" удаленный (debugpy) Python.
В поле "Целевой объект Подключение" введите команду
tcp://<ip_address>:5678
.tcp://
указывает тип подключения в качестве протокола управления передачей (TCP).<ip_address>
— ЭТО IP-адрес удаленного компьютера, который может быть явным адресом или именем, например myvm.cloudapp.net.:5678
— номер порта удаленной отладки.
Нажмите клавишу ВВОД , чтобы заполнить список доступных процессов отладки на этом компьютере:
Если после заполнения этого списка вы запускаете другую программу на удаленном компьютере, нажмите кнопку Обновить.
Выберите процесс для отладки и нажмите кнопку "Присоединить" или дважды щелкните процесс.
Visual Studio переключается в режим отладки, пока скрипт продолжает работать на удаленном компьютере, предоставляя все обычные возможности отладки.
Вы можете задать точку останова в строке
if guess < number:
, затем переключиться на удаленный компьютер и ввести другое предположение. Visual Studio на локальном компьютере останавливается в точке останова, отображает локальные переменные и т. д.При остановке отладки Visual Studio отсоединяется от программы. Программа продолжает работать на удаленном компьютере. Библиотека debugpy также продолжает прослушивать присоединение отладчиков, поэтому можно повторно присоединиться к процессу в любое время.
Устранение неполадок подключения
Ознакомьтесь со следующими точками, чтобы устранить неполадки с подключением.
Убедитесь, что выбрана удаленная версия Python (debugpy) для типа Подключение ion.
Убедитесь, что секрет в целевом объекте Подключение ion точно соответствует секрету в удаленном коде.
Убедитесь, что IP-адрес в целевом объекте Подключение ion соответствует 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
аргументы, используя имена файлов в качестве значений. Эти аргументы имеют то же значение, что и для стандартнойssl.wrap_socket
функции Python.ptvsd.enable_attach(secret='my_secret', certfile='cert.cer', keyfile='cert.key')
Вы также можете внести те же изменения в файл кода на локальном компьютере. Так как этот код на самом деле не выполняется, это не обязательно.
Перезапустите программу Python на удаленном компьютере, чтобы она была готова к отладке.
Защитите канал, добавив сертификат в доверенный корневой ЦС на компьютере Windows с помощью Visual Studio:
Скопируйте файл сертификата с удаленного компьютера на локальный.
Откройте панель управления и перейдите к сертификатам компьютера управления средствами>Windows.
В диалоговом окне certlm [Сертификаты — локальный компьютер] разверните узел доверенных корневых центров сертификации, щелкните правой кнопкой мыши сертификаты и выберите "Импорт всех задач>".
Перейдите и выберите файл .cer , скопированный с удаленного компьютера.
Продолжайте работу с диалоговым окном, чтобы завершить процесс импорта.
Повторите процесс присоединения в Visual Studio, как описано ранее в разделе "Подключение удаленно из средств Python".
Для этого экземпляра определите
tcps://
протокол для целевого объекта Подключение ion (или квалификатора).
Устранение проблем с подключением
Во время попытки подключения Visual Studio может столкнуться с проблемами. Просмотрите следующие сценарии и при необходимости выполните соответствующие действия.
Visual Studio предупреждает о потенциальных проблемах с сертификатом при подключении по протоколу SSL.
Действие. Вы можете игнорировать сообщение и продолжить.
Внимание
Имейте в виду, что, хотя канал по-прежнему шифруется от перехвата, он может быть открыт для злоумышленников в середине атак.
Visual Studio отображает удаленное предупреждение о том, что удаленный сертификат не является доверенным .
Проблема. Сертификат неправильно добавляется в доверенный корневой ЦС.
Действие. Повторно проверка шаги по добавлению сертификата в доверенный корневой ЦС на компьютере Windows и повторите попытку подключения.
Visual Studio отображает имя удаленного сертификата не соответствует предупреждению имени узла.
Проблема. Для сертификата не указано правильное имя узла или IP-адрес.
Действие. Повторно проверка действия, описанные в разделе "Защита подключения с помощью TCPS". При создании сертификата обязательно используйте правильное общее имя и повторите попытку подключения.