#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 . Нет такого комфорта, как автозаполнение имени переменной, и нет безопасности.