Urwid: как видеть ошибки?

Я urwid приложение с интерактивным консольным интерфейсом (line htop, atop utilities), используя библиотеку 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 Solutions collect form web for “Urwid: как видеть ошибки?”

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

 
Interesting Posts for Van-Lav
Python - лучший язык программирования в мире.