プログラミングで大切なのは、コード作成後のデバッグです。 デバッガを利用するのも面倒くさい場合は、print文で済ませますが、 自作のデバッグ関数があると、とても便利で頼りになります。 今回は、自分専用のデバッグ関数を作成してみましょう! それから、モジュール化して何時でも使えるようにしますよ! でも、デバッガを使いたい人は、無料オンラインのデバッガをどうぞ! オンライン・デバッガー オンライン・デバッガー(解説)
DownLoad ダウンロードして環境変数のPYTHONPATHを通してください (動画に説明あり) 【機能説明】 dbgモジュールをimportして、 変数の値を調べたい位置にdbg(変数)を挿入してください。 (呼出サンプル)を見て下さいね! 画面と、ファイルに出力されます。 ファイル名は、カレントのフォルダでdbg.txtになってます 以下のようなフォーマットです <module>は、ルート(関数になっていない)からの呼出です myDbg.py func123:12 (0, 0) myDbg.py func123:12 (1, 1) myDbg.py func123:12 (2, 3) myDbg.py <module>:18 {'Func123_Status': 3} 【使い方】 importする from dbg import dbg,dbgKw 例) トレースのみ dbg() 通常 data1 =123 data2= "abcdefg" dbg( data1,data2 ) キーワードを付ける dbgKw( キーワード=値 ) dbgKw( Func123_Status=st )
呼出サンプルfrom dbg import dbg,dbgKw def func123(): sum2 =0 for i in range( 3 ): sum2 += i dbg( i, sum2 ) return sum2 st = func123() dbgKw( Func123_Status = st ) ◆表示内容( dbg.txtファイル内容 ) dbg-sample.py func123:8 (0, 0) dbg-sample.py func123:8 (1, 1) dbg-sample.py func123:8 (2, 3) dbg-sample.py <module>:14 {'Func123_Status': 3}本体 3つの関数から出来ていますが、かなり少ないステップ数なので自由にカスタマイズして 使ってみて下さいimport inspect import os,sys ''' ------------------------------------------------------------ デバッグ関数 (自由にカスタマイズして使って下さい) 画面(コマンドラインのコンソール)と ファイル(dbg.txt)に出力されます。 フォーマットは以下(このスクリプトを実行した場合) dbg.py:76 () # 呼出 dbg() dbg.py main:72 (1, 2) # 呼出 dbg( a,b ) dbg.py func:68 {'i': 123, 'data': 'コバヤシ'} # 呼出 dbgKw( i=i, data=data ) FNAME ファイル名、フォルダを追加すれば指定フォルダに出力されます dbgWrt関数のfmtを変更して好きなフォーマットにして下さい ------------------------------------------------------------ ''' FNAME = "dbg.txt" # File Name #ファイル内容をクリアしている #(importした時に一度だけ実行されます) f =open( FNAME,"w" ) f.close() def dbgWrt( arg, fileNm, funcNm, lineNo ): # Output Format (ファイル名、関数名、行番号、引数) fmt = "%s %s:%s %s" %( fileNm, funcNm, lineNo, arg) print( fmt, flush=True ) with open( FNAME, "a" ) as f: f.write( fmt + "\n" ) def dbg( *arg ): frame = inspect.currentframe().f_back fileNm = os.path.basename(frame.f_code.co_filename) funcNm = frame.f_code.co_name lineNo = frame.f_lineno dbgWrt( arg, fileNm, funcNm, lineNo ) def dbgKw( **kwa ): frame = inspect.currentframe().f_back fileNm = os.path.basename(frame.f_code.co_filename) funcNm = frame.f_code.co_name lineNo = frame.f_lineno dbgWrt( kwa, fileNm, funcNm, lineNo ) if __name__ == "__main__": def func(): i=123 data ="コバヤシ" dbgKw( i=i, data=data ) def main(): a,b,c =(1,2,3) dbg( a,b ) func() dbg() # 引数無しでトレースを行う main()