Package: console-debugger
Что это?:wrench: :pencil: :desktop_computer: Это библиотека для Python, которая выводит информации в несколько консолей. Путем обмена данных через Unix SocketУстановка черезpip - console-debuggerpip install console-debuggerКак использовать ?1 Сначала нужно создать экземпляры класса DebuggerDebugger(active: bool, titleName: str, consoleOutput: bool = True, fileConfig: Optional[Dict] = None, styleText: Optional[dstyle] = None)АтрибутОписаниеactiveon/off жизни экземпляра, ЕслиFalseэкземпляр будет игнорировать вызов, а также будет добавлен в массивDebugger.AllCountSleepInstance.titleNameУникальное имя экземпляра которое будет отображаться в выводе.consoleOutputon/off отображения в консоль или другие визуальные выходы,Не влияет на запись в файл!.fileConfigКонфигурация записи в файл, входные параметры такие же как и у стандартной функцииopen()передавать в формате{"file":"test.log", ... }. Для удобного формирования параметров можно пользоваться функциейdopen().styleTextСтиль отображения текста. Для удобного формирования параметров можно пользоваться функциейdstyle.Также можно использовать готовые параметрыDebugger(**dDEBUG)dDEBUGdINFOdWARNINGdEXCEPTIONДоступная информации об экземпляреDebuggerpublic setОписаниеconsoleOutputПереключить on/off вывод в консольstyleTextЗадать другой стиль текстаactive()Включить дебагерdeactivate()Отключить дебагерpublic getОписаниеtitleNameУникальное имя дебагераfileConfigКонфигурация для файлаAllCountActiveInstance()Список со всеми активными экземплярамиAllCountSleepInstance()Список со всеми остановленными экземплярамиAllUseFileName()Список всех имен используемых файламиAllInstance()Список всех экземпляров2 Создать глобальные правила для всех экземпляровЭта команда влияет на все экземплярыDebuggerDebugger.GlobalManager(global_status=None, typePrint: Optional[str] = "grid"):АтрибутОписаниеglobal_statusЗдесь вы можете Выключить/Включить все экземплярыtypePrintГлобальный стиль отображения данных  (grid/socket/None)"grid"= Стиль таблица"socket"= Данные будут отправляться по сокету, в данный момент есть два варианта прослушивания сокета.
Через GUITkinterconsole_debugger/main.py guiили через TUIUrwidconsole_debugger/main.py tui.
Если в процессе отправки данных через сокет возникнут ошибки, данные будут сохранены в файл.None= Без стиля3 Использовать в кодеИспользовать стандартную функциюprint.print(text, file= Debug_Name)text= СтрокаDebug_Name= Имя экземпляраDebuggerИспользовать функциюprintD. Преимущество в том что может принимать несколько переменных и соеденять их.printD(Debug_Name, text, *args, sep=' ', end='\n')Debug_Name= Имя экземпляраDebuggertext= Строка*args= Данные преобразуются в типstrsep=' ', end='\n'= такие же, как и у встроенной функцииprint()ПримерыИспользовать свои стили оформленияДля наглядности создадим функцию для генерации случайного словоimportrandomimportstring# Сгенерировать случайное словоrandom_word=lambda:"".join(random.choice(string.ascii_letters)forjinrange(random.randint(1,40)))fromconsole_debuggerimportDebugger,printDfromconsole_debugger.helpful.template_objimportdopen,dstyleDebug=Debugger(True,titleName="[DEBUG]",fileConfig=dopen(file="debug.log",mode="a",encoding="utf-8"),styleText=dstyle(bg_color="bg_blue",len_word=21))Info=Debugger(True,titleName="[INFO]",fileConfig={"file":"info.log","mode":"a","encoding":"utf-8"},styleText=dstyle(len_word=25),consoleOutput=False)Warning=Debugger(True,"[WARNING]",styleText=dstyle(len_word=25))Debugger.GlobalManager(typePrint="grid")if__name__=='__main__':foriinrange(10):printD(Debug,random_word())printD(Warning,random_word())printD(Info,random_word())Использовать готовые стили, вызыватьprintDfromconsole_debuggerimportDebugger,printDfromconsole_debugger.helpful.template_objimportdDEBUG,dWARNING,dINFODebug=Debugger(**dDEBUG)Info=Debugger(**dINFO)Warning=Debugger(**dWARNING)Debugger.GlobalManager(typePrint="grid")if__name__=='__main__':foriinrange(10):printD(Debug,random_word())printD(Warning,random_word())printD(Info,random_word())Использовать готовые стили, вызыватьprintfromconsole_debuggerimportDebugger,printDfromconsole_debugger.helpful.template_objimportdDEBUG,dWARNING,dINFODebug=Debugger(**dDEBUG)Info=Debugger(**dINFO)Warning=Debugger(**dWARNING)Debugger.GlobalManager(typePrint="socket")if__name__=='__main__':foriinrange(10):print(random_word(),file=Debug)print(random_word(),file=Info)print(random_word(),file=Warning)Использоватьsoketfromconsole_debuggerimportDebugger,printDfromconsole_debugger.helpful.template_objimportdDEBUG,dWARNING,dINFODebug=Debugger(**dDEBUG)Info=Debugger(**dINFO)Warning=Debugger(**dWARNING)TEST=Debugger(True,"TEST")Debugger.GlobalManager(typePrint="socket")foriinrange(10):printD(Debug,random_word())printD(Info,random_word())printD(Warning,random_word())printD(TEST,random_word())Если вы не запустили сервер, у вас возникнет исключениеServerError: Ошибка сервераЭто специальное исключения для того чтобы вы лично выбрали интерфейс отображения.
Вы можете выполнить командуpython /.../.../.local/lib/python3.9/site-packages/console_debugger/main.py tuiв любом терминале Linux, в нем запуститься псевдографический интерфейс.Или вы можете выполнить командуpython /.../.../.local/lib/python3.9/site-packages/console_debugger/main.pyп guiТогда у вас запуститься графический интерфейс Tkinter.[Errno 2] No such file or directory
ServerError: Ошибка сервера
Traceback (most recent call last):
  File "/home/denis/Applications/test_imp.py", line 17, in <module>
    Debugger.GlobalManager(typePrint="socket")
  File "/.../.../.local/lib/python3.9/site-packages/console_debugger/logic/debugger.py", line 190, in GlobalManager
    raise ServerError(
helpful.date_obj.ServerError: Вероятно сервер не запущен
********************************************************************************
Выполните команду:

python /.../.../.local/lib/python3.9/site-packages/console_debugger/main.py tui

********************************************************************************Использование Глобального режима on/offСоздать два режима запуска Debug/Releasemain.pywimportsysfromconsole_debuggerimportDebuggerfromapp.viweimportWindows# При импорте должны быть созданы все экземплярыif__name__=='__main__':forparaminset(sys.argv):ifparam=="--d":Debugger.GlobalManager(typePrint="grid")# Задать глобальный стиль всем экземпляромbreakelse:Debugger.GlobalManager(global_status=False)# Если нет параметров отключаем все экземплярыWindows()В других модулях создаем необходимые экземплярыfromconsole_debuggerimportDebugger,printDfromconsole_debugger.helpful.template_objimportdstyle,dINFOHotKeyD=Debugger(True,"[HotKey]")PressKeyD=Debugger(True,"[PressKey]")InfoD=Debugger(**dINFO)ResD=Debugger(True,"[Result]",styleText=dstyle(len_word=25,height=4))printD(HotKeyD,"Crtl+c")Пример трассировки переменныхfromconsole_debuggerimportDebugger,printDfromconsole_debugger.helpful.template_objimportdDEBUG,dWARNING,dINFOif__name__=='__main__':a=Debugger(**dDEBUG)b=Debugger(**dINFO)c=Debugger(**dEXCEPTION)Debugger.GlobalManager(typePrint="socket")TracingName1="1"TracingName2=["1"]TracingName3="1",forxinrange(10):printD(a,TracingName1)printD(b,TracingName2)printD(c,TracingName3)Использование воFlaskПоместитьDebugger.GlobalManagerв@app.before_first_requestfromconsole_debuggerimportDebugger,printDfromflaskimport*SECRET_KEY="123_very_hard_password"app=Flask(__name__)# Экземпляры в глобальной области видимостиcookDeb=Debugger(True,"[Cook]")sessionDeb=Debugger(True,"[Session]")@app.before_first_requestdefdeb():# Tkinter будет перезапускаться при каждом обновление сервераDebugger.GlobalManager(typePrint="socket")@app.route("/login",methods=['POST','GET'])deflogin():globaldata,cookDeb,sessionDebcook="no"ses="no"# Получить куки если естьifrequest.cookies.get("logged"):cook=request.cookies.get("logged")# Получить данные из сессии если естьif"SessioN"insession:ses=session.get("SessioN")printD(cookDeb,cook)printD(sessionDeb,ses)res=make_response(render_template("login.html",cook=cook,session=ses))res.set_cookie(key="logged",value="yes",max_age=3)session["SessioN"]="yes"returnresif__name__=='__main__':app.run(debug=True)"login.html"<script>document.cookie="ex=1;";if(!document.cookie){alert("Этот сайт требует включение cookie");}</script>Cook: {{ cook }}<p></p>Session: {{ session }}<formaction="/login"method="post"class="form-contact"><p><label>Name</label><inputtype="text"name="username"value=""required/><p><label>Passwortitled</label><inputtype="text"name="password"value=""required/><p><inputtype="submit"value="Send"/></form>Использование вDjangoДобавить в самый конецNameProj/settings.pyimportosfromconsole_debuggerimportDebuggerfromconsole_debugger.helpful.template_objimportdDEBUG,dWARNING,dINFODEBUG=True.........ifDEBUG:Info=Debugger(**dINFO)Debug=Debugger(**dDEBUG)Warning=Debugger(**dWARNING)ifnotos.environ.get('console_debugger',False):# Для защиты от двойного запуска Djangoos.environ['console_debugger']="True"else:Debugger.GlobalManager(typePrint="socket")NameApp/views.pyfromNameProj.settingsimportInfo,Debug,Warningfromconsole_debuggerimportprintDprintD(Info,"1")printD(Info,"2")printD(Info,"3")СоветыВы можете использовать шаблон для комментированияprintDТак как входные параметры функции являются не изменяемыми обметками,
то они копируются в функциюprintD, чтобы н тратить лишении наносекунды
на эту операцию, вы можете закомментировать все вызовы этой функции.\s{4}printD+
#none: printDА потом раскомментировать#none: printD
printDПро режим отображения TkinterЕсли нажать на заголовок консоли, то они выполнят команду из нижней консолиЕсли нажать нижнею кнопкуsave geometryто вы
сохраните положение окна для следующих запусках, размеры сохранять вconsole_debugger/gui/static/config.txtЕсли закрыть окноTkinter, до завершения главного потока, то данные будут отправляться в консольtypePrint=None"Можно сохранить весь текст из консоли в файл. Для этого нужно ввести в нижнею консольsave <NAME_FILE> <PATH>и нажатьEnterМожно получить глобальную информацию о сокете, написав в любую нижнею консольg infoи нажатьEnterМожно отчистить консоль вывода, если написать в нижнею консольclearи нажатьEnterУстановка Tkinter на LinuxArchLinuxsudo pacman -S tk

xrdb -load /dev/null
xrdb -queryПро режим отображения UrwidРаботает также в терминале PycharmЭтот режим поддерживается в терминалах Linux. Программа находиться вconsole_debugger/tui/main.py.Можно сохранить весь текст из консоли в файл. Для этого нужно ввестиsave <NAME_FILE> <PATH>Горячие клавишиf1= Влевоf3= Верхf2= Внизf4= Вправоf5= МенюTab= Вправоshif + ЛКМ= Выделить текстshif + ctrl + C= Копировать выделенный текстshif + ctrl + V= Вставить текстМожно отчистить консоль вывода если написать в нижнею консольclearи нажатьEnter