Python 라이브러리의 'trace' 모듈에 있는 함수는 프로그램 실행 추적 및 주석이 달린 명령문 적용 범위를 생성합니다. 또한 호출자 관계를 생성하여 실행 중에 호출되는 함수를 나열하는 기능이 있습니다.
다음 두 개의 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입니다. 실행될 때 프로그램 라인을 표시합니다. 다음 예에서 다른 옵션 --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
--트랙콜 옵션은 –list funcs 옵션과 함께 사용됩니다. 통화 관계를 생성합니다.
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