1

ライブラリを使用してインタラクティブなコンソール インターフェイス (line htop、atop ユーティリティ) を使用してアプリケーションを構築してurwidいるため、問題は次のとおりです。

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

一度にファイル内のエラーを 1 つだけ表示したい場合は、open 関数の 'a' を 'w' に変更します (1 つのファイルに長時間にわたって複数のエラーを表示するのではなく)。

エラーが発生したときにすぐにエラーを確認したい場合は、エラー キャッチャーでエラーが表示されたウィンドウを開くことができます。

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 に答える