Мотив создания ...

Существует много проектов в которых нужно сразу увидеть результат переменных в момент выполнения программы. Например обработка нажатий клавиш от пользователя, навигация между страницами в GUI приложениях, обработка данных из форм на веб проектах. В общем во всех проектах где есть цикл событий, хорошо бы видеть значения переменных, когда идет процесс отладки. Для этого используют обычный print() но он по стандарту ограничен одной консолью, или logging() но его нужно относительно дольше настраивать, чем проект console-debugger, по причине того что нужно указывать файл, стиль вывода данных в файл, рейтинг обработки, в ручную запускать слежение за файлом, вручную закрывать слежение за файлом, когда вам больше не нужен обработчик. Я понимаю плюсы логирования но они не подходят для дебаггинг.

Console-debugger

Это программа на Python создана для вывода данных в несколько окон. Подробно можно почитать на GitHub

Установка через pip

pip install console-debugger
Терминал Manjaro Linux
Терминал Manjaro Linux
Терминал PyCharm
Терминал PyCharm
Gui Tkinter
Gui Tkinter

Пример использования

import random
import string

random_word = lambda: "".join(random.choice(string.ascii_letters) for j in range(random.randint(1, 40)))

from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO

if __name__ == '__main__':
	a = Debugger(**dDEBUG)
	b = Debugger(**dINFO)
	c = Debugger(**dEXCEPTION)

	Debugger.GlobalManager(typePrint="socket")

	for x in range(10):
		print(random_word(), file=a)
		print(random_word(), file=b)
		print(random_word(), file=c)
import random
import string

random_word = lambda: "".join(random.choice(string.ascii_letters) for j in range(random.randint(1, 40)))

from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO

if __name__ == '__main__':
	a = Debugger(**dDEBUG)
	b = Debugger(**dINFO)
	c = Debugger(**dEXCEPTION)

	Debugger.GlobalManager(typePrint="socket")

	for x in range(10):
		printD(a,"Название 1", "Примечание 1",random_word())
		printD(b,"Название 2", "Примечание 2",random_word())
		printD(c,"Название 3", "Примечание 3",random_word())

Трассировка имени переменных и конвертирование различных данных в str

from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO

if __name__ == '__main__':
	a = Debugger(**dDEBUG)
	b = Debugger(**dINFO)
	c = Debugger(**dEXCEPTION)

	Debugger.GlobalManager(typePrint="socket")

	TracingName1 = "1"
	TracingName2 = ["1"]
	TracingName3 = "1",

	for x in range(10):
		printD(a, TracingName1)
		printD(b, TracingName2)
		printD(c, TracingName3)

Комментарии (25)


  1. LazyTalent
    19.09.2021 11:30
    +2

    loggin() но его нужно относительно дольше настраивать

    Есть loguru, которую можно вообще не настраивать.


    1. unclegluk
      19.09.2021 14:24
      -1

      >>> from loguru import *

      >>> logger.debug("Hello")

      [32m2021-09-19 14:13:48.727[0m | [34m[1mDEBUG [0m | [36m__main__[0m:[36m[0m:[36m1[0m - [34m[1mHello[0m

      Информативный вывод.


      1. Vindicar
        19.09.2021 14:47

        Выделение цветами в линуксовых терминалах. Про Windows, наверно, опять забыли. =)


        1. unclegluk
          19.09.2021 15:05

          У меня нет Виндов. Это вывод IDLE для МакОс.


          1. LazyTalent
            19.09.2021 15:15
            -1

            Почему такой необычный выбор инструмента?


            1. unclegluk
              19.09.2021 18:28

              Так получилось. Когда-то устроился на работу, а там Маки. Через пару дней МакОсь зацепила. Теперь дома четыре Мака.


              1. LazyTalent
                19.09.2021 18:30
                +1

                Я про IDLE — она последняя в моём списке, чтобы я запустил для проверки кода.


                1. unclegluk
                  27.09.2021 15:25

                  Использую IDLE вместо штатного калькулятора. И это великолепный калькулятор о котором я всегда мечтал.


        1. denisxab Автор
          21.09.2021 17:59

          Для Windows есть вариант с GUI интерфейсом


      1. LazyTalent
        19.09.2021 15:07
        -1

        Или изучай особенности ОС, на которой работаешь, или учись гуглить

        github.com/Delgan/loguru/issues/246


    1. unclegluk
      19.09.2021 14:52

      От статьи ТС легче не стало. Первый же пример:

      [Errno 2] No such file or directory
      
      ServerError: Ошибка сервера
      
      Traceback (most recent call last):
      
        File "/Users/user1/Documents/test_debugger.py", line 13, in <module>
      
          Debugger.GlobalManager(typePrint="socket")
      
        File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/console_debugger/logic/debugger.py", line 200, in GlobalManager
      
          raise ServerError(
      
      helpful.date_obj.ServerError: Вероятно сервер не запущен
      
      ********************************************************************************
      
      Выполните команду:
      
      python /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/console_debugger/main.py tui
      
      ********************************************************************************


      1. denisxab Автор
        21.09.2021 18:05

        Тут написано `Вероятно сервер не запущен`

        Это специальная исключение, чтобы вы запустить сервер в удобном для вас интерфейсе.


    1. denisxab Автор
      21.09.2021 18:01

      В нем настройка, по запуску отслеживания изменений в файлах, занимает значительное время.


  1. lair
    19.09.2021 12:12
    +3

    Я понимаю плюсы логирования но они не подходят для дебаггинг.

    А почему бы не использовать для отладки, гм, отладчик?


    1. denisxab Автор
      21.09.2021 18:09

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


      1. lair
        21.09.2021 18:10
        -1

        А для этого нужно логирование, потому что вы не успеете увидеть происходящее в интерфейсе.


        1. denisxab Автор
          21.09.2021 19:07

          Для этого я создал простую топорную логику, любой не нужный в данное время обработчик, можно по отдельности включать и отключать. Как вариант для обновления - можно в инициализации указать принудительную задержку для потока, чтобы можно было все разглядеть в реальном времени, но не блокировать полностью поток. Вообще я позиционирую эту программу, изначально для тестирования проекта в процессе его написания, потому много времени уходит на то чтобы разобраться с значениями переменных, а с ней удобно, можно в несколько консолей, в реальном времени следить за состоянием какого-то алгоритма.


          1. lair
            21.09.2021 19:09
            -1

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

            Тогда вы пропустите нужную информацию, потому что обработчик будет отключен.


            Логирование все еще лучше.


            1. denisxab Автор
              21.09.2021 20:19

              Для логирование лучше логирование, с этим я соглашусь.


  1. quarckster
    19.09.2021 12:16
    +6

    from console_debugger import *

    Пожалуйста не делайте так. Давайте придерживаться хорошего стиля и импортировать явно то, что нам необходимо.


    1. denisxab Автор
      21.09.2021 18:11

      Я вас понимаю, в обновлении это исправиться.


  1. nick758
    19.09.2021 13:50

    Пользуйтесь, не факт, что нашёл все ошибки.

    Есть много проектов, в которых нужно сразу видеть значения переменных в момент выполнения программы. Например, обработка нажатий клавиш пользователем, навигация между страницами в GUI приложениях, обработка данных из форм в веб проектах. В общем, во всех проектах, где есть цикл событий, хорошо бы видеть значения переменных, когда идет процесс отладки. Для этого используют обычный print(), но по стандарту он ограничен одной консолью, или loggin(), но его сложнее настраивать, чем проект console-debugger, так как нужно указывать файл, стиль вывода данных в файл, рейтинг обработки, вручную запускать слежение за файлом, вручную закрывать слежение за файлом, когда вам больше не нужен обработчик. Я понимаю плюсы логирования, но они не подходят для дебаггинга.

    Теги тоже проверьте.



  1. kx13
    13.11.2021 22:03
    +1

    Отличная идея.

    Можно сделать как надстройку над стандартной logging.

    logger = Debuger.SetupLogger(*args)
    
    
    # и далее как обычно, например так
    # а библиотека уже в нужное окно отправит данные в зависимости от уровня логирования
    logger.debug('text')
    

    Для этого всего-то надо сделать несколько кастомных Handlers и Formatters внутри вызова SetupLogger.

    И не надо никаких "printD(a,'...')"

    logging очень гибкая библиотека с помощью Handlers и Formatters можно отправлять что угодно и куда угодно.


    1. denisxab Автор
      07.12.2021 00:54

      +