Urwid: как увидеть ошибки?
Я строю приложение с интерактивным интерфейсом консоли (линия Htop, поверх утилиты), используя urwid
библиотека, поэтому моя проблема в том, что: поскольку интерфейс занимает все пространство в окне консоли - я не мог видеть ошибки Python, я попытался сделать это:
import sys
f = open("test_err", "w")
original_stderr = sys.stderr
sys.stderr = f
print a #a is undefined
sys.stderr = original_stderr
f.close()
Это работает, когда я не использую urwid, но не когда я использую его...
2 ответа
Вы можете попробовать перенаправить ошибки в файл. после каждого запуска программы вам нужно будет обновить файл. большинство редакторов позволяют легко сделать это, нажав клавишу F5
def main():
#your code here
print someError #raises an error
try: #run main function
main()
except BaseException as err: #catch all errors
with open('errors.txt','a') as errors: #open a file to write the errors to
errors.write(err.message+'\n')#write the error
замените 'a' на 'w' в функции открытия, если вы хотите видеть только одну ошибку в файле за раз (вместо того, чтобы иметь многократную ошибку в течение длительного периода времени в одном файле).
если вы хотите увидеть ошибку прямо тогда, когда она возникает, вы можете сделать так, чтобы средство распознавания ошибок открывало окно с ошибкой.
def main():
#your code here
print someErr
try: #run main function
main()
except BaseException as err: #catch all errors
import Tkinter as tk #imports the ui module
root = tk.Tk() #creates the root of the window
#creates the text and attaches it to the root
window = tk.Label(root, text=err.message)
window.pack()
#runs the window
root.mainloop()
если вы хотите создать собственное окно для выявления ошибок, вы можете узнать о Tkinter здесь. (он встроен в python, вам не нужно ничего устанавливать)
Вот что я придумал. Я пользуюсь возможностью unicode-rxvt (urxvt) для передачи в дескрипторе файла. Конечно, это означает, что вам нужно разрабатывать это в среде X, а не в консоли.
from __future__ import print_function
import os
from datetime import datetime
_debugfile = None
def _close_debug(fo):
fo.close()
def DEBUG(*obj):
"""Open a terminal emulator and write messages to it for debugging."""
global _debugfile
if _debugfile is None:
import atexit
masterfd, slavefd = os.openpty()
pid = os.fork()
if pid: # parent
os.close(masterfd)
_debugfile = os.fdopen(slavefd, "w+", 0)
atexit.register(_close_debug, _debugfile)
else: # child
os.close(slavefd)
os.execlp("urxvt", "urxvt", "-pty-fd", str(masterfd))
print(datetime.now(), ":", ", ".join(map(repr, obj)), file=_debugfile)
Это откроет новое окно терминала автоматически при первом вызове DEBUG и закроет его при выходе. Затем любые сообщения, переданные ему, отображаются в этом новом окне. Это ваше "окно отладки". Таким образом, ваше основное приложение работает нормально, не загромождая его сообщениями, но вы все равно можете видеть выходные данные отладки в этом новом терминале.