Отправка команд и получение их вывода из запущенного приложения Python (через удаленное соединение)

#python #python-3.x #debugging #read-eval-print-loop

#python #python-3.x #отладка #чтение-оценка-печать-цикл

Вопрос:

У меня есть давно работающее серверное приложение, написанное на Python 3, которое я хотел бы время от времени интерактивно отлаживать. Для этого я хотел бы запускать команды Python «внутри» процесса серверного приложения, Проверять значения глобальных переменных и т. Д., Например, в REPL или стандартной консоли Python.

Похоже, что модуль стандартной библиотеки Python code и его InteractiveConsole класс — это то, что я ищу. Я думал о запуске этого в отдельном потоке, чтобы основное приложение не блокировалось, пока я общаюсь с ним.

Однако, похоже, что класс обеспечивает взаимодействие через стандартный ввод и вывод. Возможно, это не совсем то, что мне нужно. Есть ли способ заставить эту интерактивную консоль прослушивать / подключаться к сокету и отправлять ввод и вывод через этот сокет, чтобы я мог подключиться к консоли через TCP-соединение?

Или есть другой, лучший способ реализовать мое требование без этого code модуля?

Комментарии:

1. Люди используют logging для этой цели. Вам действительно нужно подключаться к «основному» процессу или вы можете запустить дополнительный процесс (отдельный интерпретатор) на том же компьютере?

2. Распространенным способом является сброс отладочной информации, внутреннего состояния, статистики или всего, что необходимо проверить, в файл при получении специального сигнала (например, SIGUSR1). Разве этого недостаточно для целей отладки?

3. Ну, конечно, я записываю различные данные в файл журнала. Просто я не могу постоянно регистрировать все данные, поэтому мне нужно выбрать то, что я считаю «наиболее ценными» данными для регистрации. Однако, если бы я мог подключиться к приложению и взаимодействовать через такую консоль / REPL, тогда я смог бы повторно использовать действительно все данные в любое время…

4. Для достижения базовой функциональности должен использоваться эхо-сервер TCP со строкой, подобной result = eval inputline added . Нет такого комфорта, как автозаполнение имени переменной, и нет безопасности.