Pythonステートメントの実行をトレースまたは追跡する(トレース)
Pythonライブラリの「trace」モジュールの関数は、プログラム実行のトレースと注釈付きのステートメントカバレッジを生成します。また、呼び出し元の関係を生成することにより、実行中に呼び出された関数を一覧表示する関数もあります。
次の2つのPythonスクリプトは、トレースモジュールの機能を示す例として使用されています。
#myfunctions.py import math def area(x): a = math.pi*math.pow(x,2) return a def factorial(x): if x==1: return 1 else: return x*factorial(x-1)
#mymain.py import myfunctions def main(): x = 5 print ('area=',myfunctions.area(x)) print ('factorial=',myfunctions.factorial(x)) if __name__=='__main__': main()
'trace'モジュールにはコマンドラインインターフェイスがあります。モジュール内のすべての関数は、コマンドラインスイッチを使用して呼び出すことができます。最も重要なオプションは-trace 実行時にプログラム行を表示します。次の例では、別のオプション-ignore-dir 使用されている。トレースの生成中は、指定されたディレクトリを無視します。
E:\python37>python -m trace --ignore-dir=../lib --trace mymain.py
出力
mymain.py(2): def main(): mymain.py(7): if __name__=='__main__': mymain.py(8): main() --- modulename: mymain, funcname: main mymain.py(3): x=5 mymain.py(4): print ('area=',myfunctions.area(x)) --- modulename: myfunctions, funcname: area myfunctions.py(3): a=math.pi*math.pow(x,2) myfunctions.py(4): return a area= 78.53981633974483 mymain.py(5): print ('factorial=',myfunctions.factorial(x)) --- modulename: myfunctions, funcname: factorial myfunctions.py(6): if x==1: myfunctions.py(9): return x*factorial(x-1) --- modulename: myfunctions, funcname: factorial myfunctions.py(6): if x==1: myfunctions.py(9): return x*factorial(x-1) --- modulename: myfunctions, funcname: factorial myfunctions.py(6): if x==1: myfunctions.py(9): return x*factorial(x-1) --- modulename: myfunctions, funcname: factorial myfunctions.py(6): if x==1: myfunctions.py(9): return x*factorial(x-1) --- modulename: myfunctions, funcname: factorial myfunctions.py(6): if x==1: myfunctions.py(7): return 1 factorial= 120
--count オプションは、カバー拡張子で使用されているモジュールごとにファイルを生成します。
E:\python37>python -m trace --count mymain.py area= 78.53981633974483 factorial = 120
myfunctions.cover
1: import math 1: def area(x): 1: a = math.pi*math.pow(x,2) 1: return a 1: def factorial(x): 5: if x==1: 1: return 1 else: 4: return x*factorial(x-1)
mymain.cover
1: import myfunctions 1: def main(): 1: x = 5 1: print ('area=',myfunctions.area(x)) 1: print ('factorial=',myfunctions.factorial(x)) 1: if __name__=='__main__': 1: main()
-概要 –countオプションも使用されている場合、オプションは簡単な要約を表示します。
E:\python37>python -m trace --count --summary mymain.py area = 78.53981633974483 factorial = 120 lines cov% module (path) 8 100% myfunctions (E:\python37\myfunctions.py) 7 100% mymain (mymain.py)
-ファイル オプションは、複数のトレース実行にわたってカウントを累積するファイルの名前を指定します。
E:\python37>python -m trace --count --file report.txt mymain.py area = 78.53981633974483 factorial = 120 Skipping counts file 'report.txt': [Errno 2] No such file or directory: 'report.txt' E:\python37>python -m trace --count --file report.txt mymain.py area= 78.53981633974483 factorial= 120
-listfuncs オプションは、プログラムの実行中に呼び出された関数を表示します。
E:\python37>python -m trace --listfunc mymain.py | findstr -v importlib area= 78.53981633974483 factorial= 120 functions called: filename: E:\python37\lib\encodings\cp1252.py, modulename: cp1252, funcname: IncrementalEncoder.encode filename: E:\python37\myfunctions.py, modulename: myfunctions, funcname: <module> filename: E:\python37\myfunctions.py, modulename: myfunctions, funcname: area filename: E:\python37\myfunctions.py, modulename: myfunctions, funcname: factorial filename: mymain.py, modulename: mymain, funcname: <module> filename: mymain.py, modulename: mymain, funcname: main
-トラックコール オプションは、–listfuncsオプションと一緒に使用されます。通話関係を生成します。
E:\python37>python -m trace --listfunc --trackcalls mymain.py | findstr -v importlib area= 78.53981633974483 factorial= 120 calling relationships: --> E:\python37\myfunctions.py *** E:\python37\lib\trace.py *** --> mymain.py trace.Trace.runctx -> mymain.<module> *** E:\python37\myfunctions.py *** myfunctions.factorial -> myfunctions.factorial *** mymain.py *** mymain.<module> -> mymain.main --> E:\python37\lib\encodings\cp1252.py mymain.main -> cp1252.IncrementalEncoder.encode --> E:\python37\myfunctions.py mymain.main -> myfunctions.area mymain.main -> myfunctions.factorial
-
Pythonを使用して画面に印刷するにはどうすればよいですか?
画面に出力する基本的な方法は、printステートメントを使用することです。 >>> print 'Hello, world' Hello, world スペースで区切られた同じ行に複数のものを印刷するには、それらの間にコンマを使用します。例: >>> print 'Hello,', 'World' Hello, World どちらの文字列にもスペースが含まれていませんでしたが、2つのオブジェクトの間にコンマがあるため、printステートメントによってスペースが追加されました。任意のデータ型は、同じprint
-
Pythonでのassertステートメントの使用は何ですか?
assertステートメントの構文は次のとおりです。 assert <some_test>, <message>をアサートします 上記の行は次のように読み取られます。がFalseと評価された場合、例外が発生し、が出力されます。 コードブロックまたは式をテストする場合は、assertキーワードの後に配置します。テストに合格するか、式がtrueと評価された場合、何も起こりません。ただし、テストが失敗した場合、または式がfalseと評価された場合、AssertionErrorが発生し、メッセージが出力または評価されます。 Assertステートメントは、ユーザー定義の制