Это подключаемая библиотека, для удобного вывода отладочной информации.
Project description
Что это?
:wrench: :pencil: :desktop_computer: Это библиотека для Python, которая выводит информации в несколько консолей. Путем обмена данных через Unix Socket
Установка через pip - console-debugger
pip install console-debugger
Как использовать ?
1 Сначала нужно создать экземпляры класса Debugger
Debugger(active: bool, titleName: str, consoleOutput: bool = True, fileConfig: Optional[Dict] = None, styleText: Optional[dstyle] = None
)
Атрибут | Описание |
---|---|
active |
on/off жизни экземпляра, Если False экземпляр будет игнорировать вызов, а также будет добавлен в массив Debugger.AllCountSleepInstance . |
titleName |
Уникальное имя экземпляра которое будет отображаться в выводе. |
consoleOutput |
on/off отображения в консоль или другие визуальные выходы, Не влияет на запись в файл! . |
fileConfig |
Конфигурация записи в файл, входные параметры такие же как и у стандартной функции open() передавать в формате {"file":"test.log", ... } . Для удобного формирования параметров можно пользоваться функцией dopen() . |
styleText |
Стиль отображения текста. Для удобного формирования параметров можно пользоваться функцией dstyle . |
Также можно использовать готовые параметры
Debugger(**dDEBUG
)
dDEBUG
dINFO
dWARNING
dEXCEPTION
Доступная информации об экземпляре Debugger
public set | Описание |
---|---|
consoleOutput |
Переключить on/off вывод в консоль |
styleText |
Задать другой стиль текста |
active() |
Включить дебагер |
deactivate() |
Отключить дебагер |
public get | Описание |
---|---|
titleName |
Уникальное имя дебагера |
fileConfig |
Конфигурация для файла |
AllCountActiveInstance() |
Список со всеми активными экземплярами |
AllCountSleepInstance() |
Список со всеми остановленными экземплярами |
AllUseFileName() |
Список всех имен используемых файлами |
AllInstance() |
Список всех экземпляров |
2 Создать глобальные правила для всех экземпляров
Эта команда влияет на все экземпляры Debugger
Debugger.GlobalManager(global_status=None, typePrint: Optional[str] = "grid"
):
Атрибут | Описание |
---|---|
global_status |
Здесь вы можете Выключить/Включить все экземпляры |
typePrint |
Глобальный стиль отображения данных (grid /socket /None ) |
"grid"
= Стиль таблица"socket"
= Данные будут отправляться по сокету, в данный момент есть два варианта прослушивания сокета. Через GUI Tkinterconsole_debugger/main.py gui
или через TUI Urwidconsole_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
= Имя экземпляраDebugger
text
= Строка*args
= Данные преобразуются в типstr
sep=' ', end='\n'
= такие же, как и у встроенной функцииprint()
Примеры
Использовать свои стили оформления
Для наглядности создадим функцию для генерации случайного слово
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 dopen, dstyle
Debug = 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__':
for i in range(10):
printD(Debug, random_word())
printD(Warning, random_word())
printD(Info, random_word())
Использовать готовые стили, вызывать printD
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
Debug = Debugger(**dDEBUG)
Info = Debugger(**dINFO)
Warning = Debugger(**dWARNING)
Debugger.GlobalManager(typePrint="grid")
if __name__ == '__main__':
for i in range(10):
printD(Debug, random_word())
printD(Warning, random_word())
printD(Info, random_word())
Использовать готовые стили, вызывать print
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
Debug = Debugger(**dDEBUG)
Info = Debugger(**dINFO)
Warning = Debugger(**dWARNING)
Debugger.GlobalManager(typePrint="socket")
if __name__ == '__main__':
for i in range(10):
print(random_word(), file=Debug)
print(random_word(), file=Info)
print(random_word(), file=Warning)
Использовать soket
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
Debug = Debugger(**dDEBUG)
Info = Debugger(**dINFO)
Warning = Debugger(**dWARNING)
TEST = Debugger(True,"TEST")
Debugger.GlobalManager(typePrint="socket")
for i in range(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/Release
main.pyw
import sys
from console_debugger import Debugger
from app.viwe import Windows # При импорте должны быть созданы все экземпляры
if __name__ == '__main__':
for param in set(sys.argv):
if param == "--d":
Debugger.GlobalManager(typePrint="grid") # Задать глобальный стиль всем экземпляром
break
else:
Debugger.GlobalManager(global_status=False) # Если нет параметров отключаем все экземпляры
Windows()
В других модулях создаем необходимые экземпляры
from console_debugger import Debugger, printD
from console_debugger.helpful.template_obj import dstyle, dINFO
HotKeyD = 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")
Пример трассировки переменных
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)
Использование во Flask
Поместить Debugger.GlobalManager
в @app.before_first_request
from console_debugger import Debugger, printD
from flask import *
SECRET_KEY = "123_very_hard_password"
app = Flask(__name__)
# Экземпляры в глобальной области видимости
cookDeb = Debugger(True, "[Cook]")
sessionDeb = Debugger(True, "[Session]")
@app.before_first_request
def deb():
# Tkinter будет перезапускаться при каждом обновление сервера
Debugger.GlobalManager(typePrint="socket")
@app.route("/login", methods=['POST', 'GET'])
def login():
global data, cookDeb, sessionDeb
cook = "no"
ses = "no"
# Получить куки если есть
if request.cookies.get("logged"):
cook = request.cookies.get("logged")
# Получить данные из сессии если есть
if "SessioN" in session:
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"
return res
if __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 }}
<form action="/login" method="post" class="form-contact">
<p><label>Name </label><input type="text" name="username" value="" required/>
<p><label>Passwortitled </label><input type="text" name="password" value="" required/>
<p><input type="submit" value="Send"/>
</form>
Использование в Django
Добавить в самый конец NameProj/settings.py
import os
from console_debugger import Debugger
from console_debugger.helpful.template_obj import dDEBUG, dWARNING, dINFO
DEBUG = True
...
...
...
if DEBUG:
Info = Debugger(**dINFO)
Debug = Debugger(**dDEBUG)
Warning = Debugger(**dWARNING)
if not os.environ.get('console_debugger', False): # Для защиты от двойного запуска Django
os.environ['console_debugger'] = "True"
else:
Debugger.GlobalManager(typePrint="socket")
NameApp/views.py
from NameProj.settings import Info,Debug,Warning
from console_debugger import printD
printD(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 на Linux
ArchLinux
sudo 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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for console_debugger-0.1.8.8-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce2db04fec7507683287a30fb660a730e4b1f1c975fc3799081e546a7e3c2bfc |
|
MD5 | 143b5282790ba6f4d75b2bb28e9918ab |
|
BLAKE2b-256 | 76e4f89115faa754467d2e363c5d2bcd153280ca0f544ace50f32a2c08ad4a73 |