Удаленная отладка кода Python в Linux
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Visual Studio позволяет локально и удаленно запускать приложения Python на компьютере Windows и выполнять их отладку (см. статью Удаленная отладка). С помощью библиотеки debugpy можно также выполнять удаленную отладку, используя другую операционную систему, другое устройство или реализацию Python, отличную от CPython.
При работе c debugpy для отлаживаемого кода Python создается сервер отладки, к которому может подключаться Visual Studio. Для такого размещения нужно внести лишь небольшое изменение в код для импорта и запуска сервера и в некоторых случаях скорректировать на удаленном компьютере настройки сети и брандмауэра, чтобы разрешить подключения TCP.
Для Visual Studio 2019 версии 16.4 и более ранних версий использовалась библиотека ptvsd. В Visual Studio 2019 версии 16.5 библиотека ptvsd 4 заменена библиотекой debugpy.
Настройка компьютера Linux
Для выполнения данного пошагового руководства необходимо следующее:
- удаленный компьютер с Python на базе операционной системы, такой как Mac OSX или Linux;
- открытый порт 5678 (входящий трафик) в брандмауэре этого компьютера, который используется по умолчанию для удаленной отладки.
Это пошаговое руководство основано на Visual Studio 2019 версии 16.6.
Можно без труда создать виртуальную машину Linux в Azure и получить к ней доступ с помощью удаленного рабочего стола из Windows. Для виртуальной машины удобно использовать Ubuntu, так как Python устанавливается по умолчанию. В противном случае см. список в разделе Выбор и установка интерпретатора Python с перечнем дополнительных расположений скачиваемых файлов Python.
Дополнительные сведения о создании правила брандмауэра для виртуальной машины Azure см. в статье Открытие портов для виртуальной машины в Azure с помощью портала Azure.
Подготовка скрипта к отладке
- Создайте на удаленном компьютере файл Python guessing-game.py со следующим кодом:
import random guesses_made = 0 name = input('Hello! What is your name?\n') number = random.randint(1, 20) print('Well, , 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, ! You guessed my number in guesses!'.format(name, guesses_made)) else: print('Nope. The number I was thinking of was '.format(number))
Примечание. Рекомендуется записать устанавливаемую версию debugpy на случай необходимости устранения неполадок. Доступные версии также можно найти в списке debugpy.
import debugpy debugpy.listen(('0.0.0.0', 5678))
Помимо listen и wait_for_client , debugpy предоставляет вспомогательную функцию breakpoint , которая обрабатывается как программная точка останова, если присоединен отладчик. Существует также функция is_client_connected , которая возвращает значение True , если присоединен отладчик (но вы не обязаны проверять этот результат, прежде чем вызывать любые другие функции debugpy ).
Удаленное подключение с помощью инструментов Python
В следующем примере мы устанавливаем простую точку останова, чтобы прервать выполнение удаленного процесса.
- Скопируйте удаленный файл на локальный компьютер и откройте его в Visual Studio. Вы можете разместить этот файл в любом каталоге, но его имя должно совпадать с именем скрипта на удаленном компьютере.
- Чтобы технология IntelliSense для debugpy работала на локальном компьютере, установите пакет debugpy в среде Python (необязательно).
- Выберите Отладка>Присоединение к процессу.
- В открывшемся диалоговом окне Присоединение к процессу задайте для параметра Тип подключения значение Python remote (debugpy) (Удаленная отладка Python (debugpy)).
- В поле Цель подключения введите tcp://:5678 , где — IP-адрес удаленного компьютера (может быть явным адресом или именем, например myvm.cloudapp.net), а :5678 — номер порта удаленной отладки.
- Нажмите клавишу ВВОД, чтобы заполнить список доступных процессов debugpy на этом компьютере:
Если после заполнения этого списка вы запускаете другую программу на удаленном компьютере, нажмите кнопку Обновить. - Выберите процесс для отладки, а затем нажмите Присоединить, либо дважды щелкните процесс.
- Visual Studio переключается в режим отладки, а скрипт продолжает выполняться на удаленном компьютере, предоставляя все обычные возможности отладки. Например, установите точку останова в строке if guess < number: , затем переключитесь на удаленный компьютер и введите другую догадку. После этого Visual Studio на локальном компьютере останавливается в этой точке останова, показывает локальные переменные и т. д.

- При остановке отладки Visual Studio отключается от программы, которая продолжает выполняться на удаленном компьютере. Библиотека debugpy также продолжает прослушивать присоединение отладчиков, поэтому можно повторно присоединиться к процессу в любое время.
Устранение неполадок при подключении
- Убедитесь, что для параметра Тип подключения выбрано значение Python remote (debugpy) (Удаленная отладка Python (debugpy)).
- Убедитесь, что секрет в поле Цель подключения точно соответствует секрету в удаленном коде.
- Убедитесь, что IP-адрес в поле Цель подключения точно совпадает с IP-адресом удаленного компьютера.
- Убедитесь, что на удаленном компьютере открыт порт удаленной отладки, а в целевой объект соединения включен суффикс порта, такой как :5678 .
- Чтобы использовать другой порт, укажите его в listen , как в debugpy.listen((host, port)) . В этом случае откройте соответствующий порт в брандмауэре.
- Убедитесь, что установленная версия debugpy на удаленном компьютере, возвращенная pip3 list , соответствует используемой версии инструментов Python в Visual Studio в таблице ниже. При необходимости обновите debugpy на удаленном компьютере.
Версия Visual Studio Версия инструментов Python или debugpy 2019 16.6 1.0.0b5 2019 16.5 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 для отладки в прежних версиях
Visual Studio 2017 версии 15.8 и более поздних версий использует отладчик на основе ptvsd версии 4.1 и более поздних. Visual Studio 2019 версии 16.5 и последующих версий использует отладчик на основе debugpy. Эти версии отладчика совместимы с Python 2.7, а также Python 3.5 и последующих версий. Если вы используете Python 2.6 и 3.1–3.4 или IronPython, Visual Studio отображает ошибку Debugger does not support this Python environment (Отладчик не поддерживает эту среду Python). Следующие сведения относятся только к удаленной отладке с помощью ptvsd версии 3.x.
- При использовании ptvsd 3.x функции enable_attach требуется передавать «секрет» в качестве первого аргумента, который ограничивает доступ к выполняющемуся скрипту. Этот секрет нужно ввести при присоединении удаленного отладчика. Хотя это не рекомендуется, можно разрешить подключаться любым пользователям с помощью enable_attach(secret=None) .
- Целевой URL-адрес подключения — tcp://@:5678 , где — это функция enable_attach , передаваемая в виде строки в коде Python.
По умолчанию подключение к серверу удаленной отладки ptvsd 3.x защищено только с помощью секрета, а все данные передаются в виде обычного текста. Для более безопасного соединения ptvsd 3.x поддерживает SSL с использованием протокола tcsp , который настраивается следующим образом.
-
На удаленном компьютере создайте отдельный самозаверяющий сертификат и файлы ключа, используя openssl:
openssl req -new -x509 -days 365 -nodes -out cert.cer -keyout cert.key
ptvsd.enable_attach(secret='my_secret', certfile='cert.cer', keyfile='cert.key')
То же изменение можно внести в файл кода на локальном компьютере, но так как этот код не выполнялся, делать это необязательно.
- Скопируйте файл сертификата с удаленного компьютера на локальный.
- Откройте панель управления и перейдите к компоненту Администрирование>Управление сертификатами компьютера.
- В открывшемся окне в левой части разверните узел Доверенные корневые центры сертификации, правой кнопкой мыши щелкните Сертификаты и выберите пункты Все задачи>Импорт.
- Найдите и выберите файл CER, скопированный с удаленного компьютера, а затем выполните действия, описанные в диалоговых окнах, чтобы завершить импорт.

- Если отображается предупреждение о том, что удаленный сертификат не является доверенным, это означает, что для доверенного корневого ЦС не был правильно добавлен сертификат. Проверьте эти действия и повторите попытку.

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

Программа на Python для управления компьютером / PyAutoGui

Питон славиться наличием большого количества очень крутых библиотек. В статье мы рассмотрим работу с библиотекой PyAutoGui, которая позволяет манипулировать компьютером.
Первое что необходимо сделать — это установить всё необходимое. Нам потребуется установить Python с официального сайта , а также скачать IDE, можно использовать PyCharm и далее создать внутри него новый проект.
Установка библиотеки
Теперь необходимо выполнить установку всех библиотек. Если вы работаете на Windows, то вам повезло и все что нужно — команду pip install pyautogui.
Если же вы работаете на Mac OS, то лучше вначале выполнить установку pip install pyobjc, сразу же за ней выполнить установку pip install pyobjc-core и только потом выполнить установку pip install pyautogui.
Работа с библиотекой
Используя библиотеку вы можете работать с мышью: вводить ею, нажимать, перетаскивать и так далее, а также можете работать с клавиатурой: вводить текст, нажимать на клавиши, выполнять нажатие на связку команд.
Некоторые из команд представлены ниже вместе с описанием:
import pyautogui as pg # Получение позиции мыши и вывод в консоль print(pg.position()) # Передвижение мыши pg.move(50, 50, duration=0.5) pg.moveTo(150, 200, 0.5) # Передвигаем к точке относительно экрана # Нажатие мышкой по определенной точке pg.click(769, 101) pg.doubleclick(769, 101) # двойное нажатие pg.rightclick(769, 101) # нажатие правой кнопкной мыши pg.leftclick(769, 101) # нажатие левой кнопкной мыши # Ввод текста pg.typewrite("itproger.com") # Выполнения нажатия на клавишу pg.typewrite(["enter"]) # Выполнения нажатия на сочетание клавиш pg.hotkey("winleft") pg.hotkey("winleft", "up") pg.hotkey("ctrl", "t") # Вызов различных всплывающих окон pg.alert("Окно с информацией", "Название окна", button="Текст на кнопке") age = pg.prompt("Укажите возраст: ", "Название окна") print(age) pg.confirm("Вам больше 18?", "Название окна", ("Да, точно", "Нет")) pg.password("Введите пароль", "Название окна") # Создание скриншота pg.screenshot("yourPic.png") # Мини программа website = pg.prompt("Введите название сайта:", "Веб сайт", "https://") pg.click(769, 101) pg.typewrite(website) pg.typewrite(["enter"]) pg.screenshot("yourPic.png")
Видео на эту тему
Также вы можете просмотреть детальное видео по работе с библиотекой:
Дополнительный курс
На нашем сайте также есть углубленный курс по изучению языка Питон . В ходе огромной программы вы изучите не только язык Питон, но также научитесь создавать веб сайты за счёт веб технологий и фреймворка Джанго. За курс вы изучите массу нового и к концу программы будете уметь работать с языком Питон, создавать на нём полноценные ПК приложения на основе библиотеки Kivy, а также создавать веб сайты на основе библиотеки Джанго.
Больше интересных новостей

Факторы, которые мешают junior’у добиться успеха

5 инструментов на основе искусственного интеллекта от Google

Почему Python отлично подходит для начинающих?

Изучение Python Kivy в одной статье! Основы Kivy
Комментарии (1)
Крипи 22 октября 2022 в 09:41
Запуск программы на удаленном компьютере
Мне нужно запустить .bat файл из питона(по определенному условию) на компьютере(вин10) к которому я имею доступ по сети. Те работает питоновский скрипт на сервере , он дожен запустить файл удаленно. Я так понимаю нужен запущенный скрипт на принимающем компьюторе. Какими средствами это делается?
Отслеживать
задан 14 фев 2021 в 14:49
medium2000 medium2000
57 4 4 бронзовых знака
github.com/jborean93/pypsexec#examples так же можете посмотреть в сторону paramiko (вин10 может в ssh)
14 фев 2021 в 14:54
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
способы удаленного запуска python-скриптов
допустим, у меня есть набор консольных команд, которые должны быть извлечены на целевой линукс машине (машин может быть несколько), команды засунуты в питон. как лучше запускать и доставлять скрипт?
- запускать программу на «запускаторе», который через ssh будет отправлять последовательно команды на целевые машинки
- разлить скрипт по машинкам по ssh и уже локальный скрипт дергать удаленно
- использовать монструозную систему управления конфигурациями
или это зависит требований и контекста? какие еще варианты?

chenbr0 ☆
15.05.19 10:59:47 MSK
alpha ★★★★★
( 15.05.19 11:02:21 MSK )
Ответ на: комментарий от alpha 15.05.19 11:02:21 MSK

это третий пункт, ок. а с какого количества целевых машин ансибль имеет смысл?
chenbr0 ☆
( 15.05.19 11:04:16 MSK ) автор топика
Ответ на: комментарий от chenbr0 15.05.19 11:04:16 MSK

а с какого количества целевых машин имеет смысл ssh ?
router ★★★★★
( 15.05.19 11:19:48 MSK )
Ответ на: комментарий от router 15.05.19 11:19:48 MSK

сейчас я обкатываю скрипт и целевая машина одна. это быстро и удобно, вполне устраивает. поэтому здесь и сейчас нет смысла в ансибле. я вот и думаю, что делать когда машин станет больше.
chenbr0 ☆
( 15.05.19 11:22:11 MSK ) автор топика
cat hello.py| ssh [user@]hostname python -
alx777 ★★
( 15.05.19 12:15:33 MSK )
Была такая штука fabric, может и сейчас есть. Там все как тебе нужно, наверное.
kryonn
( 15.05.19 12:29:38 MSK )
Ответ на: комментарий от chenbr0 15.05.19 11:04:16 MSK
Нет, это четвертый.
Ansible становится монструозным когда на нем делаются монструозные вещи.
А для твоей задачи ansible playbook будет в три раза короче и проще чем любой баш-скрипт который ты попробуешь написать самостоятельно. Строчек в пять можно уложиться.
Плюс не будет мучительно больно потом, когда осознаешь что и парк машин вырос и хотелки заметно увеличились и пора таки браться за ум.
alpha ★★★★★
( 15.05.19 13:16:26 MSK )
Последнее исправление: alpha 15.05.19 13:17:50 MSK (всего исправлений: 1)
Ответ на: комментарий от alpha 15.05.19 13:16:26 MSK

Как будто это что-то плохое.
Часто написать скрипт намного проще.
Зачем городить огород, который нужен только для 1.5 землекопа.
А если машин станет больше, обход скриптом по списку машин не сильно изменит трудоемкость.
TomBOY ★★
( 15.05.19 14:07:27 MSK )
Ответ на: комментарий от chenbr0 15.05.19 11:22:11 MSK
Jopich1 ☆
( 15.05.19 14:11:45 MSK )
Последнее исправление: Jopich1 15.05.19 14:12:42 MSK (всего исправлений: 1)
Ответ на: комментарий от TomBOY 15.05.19 14:07:27 MSK
Часто написать скрипт намного проще.
Не в случае ansible.
А если машин станет больше, обход скриптом по списку машин не сильно изменит трудоемкость.
И добавление retry не сильно изменит, и параметризация машин, и чуть-чуть разные версии систем. и таймаут, и debug-лог. и потом раз: и у тебя нечитаемая простыня на 100500 строк на баше. Откуда ж она взялась, вроде всё «просто» было?
alpha ★★★★★
( 15.05.19 14:17:10 MSK )
Ответ на: комментарий от alpha 15.05.19 14:17:10 MSK

И добавление retry не сильно изменит, и параметризация машин, и чуть-чуть разные версии систем. и таймаут, и debug-лог..
А в случае Ansible открывать все эти радости жизни ему не придется? Ansible это выжимка лучшего опыта, это ему поможет, но на это тоже придется немало потратить времени.
TomBOY ★★
( 15.05.19 14:42:39 MSK )
Ответ на: комментарий от chenbr0 15.05.19 11:04:16 MSK

SevikL ★★★★★
( 15.05.19 15:07:26 MSK )
Ответ на: комментарий от TomBOY 15.05.19 14:42:39 MSK
А в случае Ansible открывать все эти радости жизни ему не придется?
Придётся, в доке на первой странице, минут за 10. В stackoverflow за 3.
alpha ★★★★★
( 15.05.19 15:08:42 MSK )
Ответ на: комментарий от TomBOY 15.05.19 14:42:39 MSK

придется. но времени на это уйдёт явно меньше, чем на написание шелл-скрипта с retry и логами.
SevikL ★★★★★
( 15.05.19 15:10:23 MSK )

чем ансибль лучше дженкинса, папета и тд?
chenbr0 ☆
( 15.05.19 15:45:38 MSK ) автор топика
Ответ на: комментарий от chenbr0 15.05.19 15:45:38 MSK
Jopich1 ☆
( 15.05.19 15:51:57 MSK )
Ответ на: комментарий от chenbr0 15.05.19 15:45:38 MSK
чем ансибль лучше дженкинса, папета и тд?
Это совсем разные категории
Дженкинс — это java-комбайн: планировщик, очередь, обработчики, пост-хуки, web UI, groovy и нечитаемые exceptions.
Puppet — это мастер-слейв, программирование на ruby, ООП, сложные зависимости..
ansible, в своем простейшем варианте, без Tower и фишечек, это по сути аннотированный баш-скрипт. То есть берешь свой скрипт и из каждой строчки делаешь шаг в yaml-е добавив строку описания.
#!/bin/bash dnf install smth service start smth
- name: "Install smth" run: "dnf install smth" - name: "Start service smth" run: "service start smth" .
Потом конечно чуть подумаешь и заменишь стандартные команды на готовые обертки.
- name: "Install smth if not installed" pkg: name: "smth" state: installed - name: "Start service smth, if not started" service: name: smth state: started .
и пошла эволюция.
И он не требует никакой предварительной инфраструктуры кроме ssh-доступа на сервер.
alpha ★★★★★
( 15.05.19 17:55:22 MSK )
Последнее исправление: alpha 15.05.19 18:00:14 MSK (всего исправлений: 1)
Использовать ansible. Он не монструозный, умеет первые два пункта в любых комбинациях и делает это заведомо лучше чем набыдлокодишь ты.
slovazap ★★★★★
( 15.05.19 18:01:55 MSK )

У меня ssh доступ по публичному ключу и
scp -r ./setup.sh $TARGET_HOST:$REMOTE_TEMP_DIR ssh $TARGET_HOST
Aber ★★★★★
( 15.05.19 18:16:40 MSK )

Ансибл бери, если тебе не нужно смотреть глазами в вывод, того, что делается, ибо добиться от ансибла нормального вывода очень не просто.
Difrex ★★★★
( 15.05.19 19:39:54 MSK )
Ответ на: комментарий от Difrex 15.05.19 19:39:54 MSK

нужно(: ну вывод отдельно перехватывается, так что вывод ансибля не критичен
chenbr0 ☆
( 15.05.19 20:32:55 MSK ) автор топика
Ответ на: комментарий от slovazap 15.05.19 18:01:55 MSK

но-но-но, у меня все причесано по пеп8, гы. ансибль так ансибль, ок.
chenbr0 ☆
( 15.05.19 20:33:48 MSK ) автор топика

убедили в ансибле, тем более он уже есть, правда я его не ковырял особо. значит придется
chenbr0 ☆
( 15.05.19 20:34:51 MSK ) автор топика
Ответ на: комментарий от chenbr0 15.05.19 20:33:48 MSK
Python fabric как раз по пеп8
Jopich1 ☆
( 15.05.19 20:45:44 MSK )
Последнее исправление: Jopich1 15.05.19 20:45:59 MSK (всего исправлений: 1)
Мб ансибляторы и правы, но вот тут уже набыдлокодили то, что тебе нужно: https://github.com/roonyx-tech/runy-deploy
WitcherGeralt ★★
( 15.05.19 20:48:05 MSK )
Ответ на: комментарий от Jopich1 15.05.19 20:45:44 MSK

мне хватает пайтеста пока что, не хочу отвлекаться еще на один фреймворк
chenbr0 ☆
( 15.05.19 21:30:09 MSK ) автор топика
Ответ на: комментарий от WitcherGeralt 15.05.19 20:48:05 MSK

спасибо конечно, но я лучше в резюме ансибль напишу, чем “ранидеплой”
chenbr0 ☆
( 15.05.19 21:31:22 MSK ) автор топика
Ответ на: комментарий от chenbr0 15.05.19 21:30:09 MSK
это не фреймворк а просто обертка на ssh в python стиле
