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 и закроет его при выходе. Затем любые сообщения, переданные ему, отображаются в этом новом окне. Это ваше "окно отладки". Таким образом, ваше основное приложение работает нормально, не загромождая его сообщениями, но вы все равно можете видеть выходные данные отладки в этом новом терминале.

Другие вопросы по тегам