1

我正在使用urwid库构建具有交互式控制台界面(行 htop,atop 实用程序)的应用程序,所以我的麻烦是:由于界面占用了控制台窗口中的所有空间 - 我看不到 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 时有效,但在我使用时无效......

4

2 回答 2

0

这就是我想出的。我正在利用 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 时自动打开一个新的终端窗口并在退出时将其关闭。然后传递给它的任何消息都会显示在这个新窗口中。这是您的“调试窗口”。因此,您的主应用程序可以正常运行,不会被消息弄得一团糟,但您仍然可以在这个新终端中看到调试输出。

于 2012-10-21T20:19:56.160 回答
0

您可以尝试将错误重定向到文件。每次运行程序后,都需要刷新文件。大多数编辑器让您通过按 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

如果您只想一次在文件中看到一个错误(而不是在一个文件中长时间出现多个错误),请将 open 函数中的“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中,你不必安装任何东西)

于 2012-10-13T21:11:10.727 回答