Удаленная отладка кода 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 см. в следующих статьях:

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

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

  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. Эта функция служит программной точкой останова, если отладчик подключен. Другая функция возвращаетсяTrue, is_client_connected1если отладчик подключен. Перед вызовом других debugpy функций вам не нужно проверка этот результат.

Удаленное подключение с помощью инструментов Python

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

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

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

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

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

  5. В поле "Целевой объект Подключение" введите командуtcp://<ip_address>:5678.

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

    Screenshot that shows how to enter the connection target to see a list of available debugpy processes.

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

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

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

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

    Screenshot that shows how Visual Studio pauses debugging when a breakpoint is hit.

  9. При остановке отладки 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, выполните следующие действия:

  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 аргументы, используя имена файлов в качестве значений. Эти аргументы имеют то же значение, что и для стандартной ssl.wrap_socket функции Python.

    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:// протокол для целевого объекта Подключение ion (или квалификатора).

    Screenshot that shows how to specify TCPS as the remote debugging transport with SSL.

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

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

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

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

    Внимание

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

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

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

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

    Screenshot of the warning that says the remote SSL certificate isn't trusted.

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

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

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

    Screenshot of the warning that says the remote SSL certificate doesn't match the hostname.