Computer >> Máy Tính >  >> Lập trình >> Python

Theo dõi hoặc theo dõi việc thực thi câu lệnh Python (theo dõi)

Hàm trong mô-đun 'dấu vết' trong thư viện Python tạo ra dấu vết của việc thực thi chương trình và phạm vi câu lệnh có chú thích. Nó cũng có các chức năng để liệt kê các chức năng được gọi trong quá trình chạy bằng cách tạo các mối quan hệ người gọi.

Hai tập lệnh Python sau được sử dụng làm ví dụ để chứng minh các tính năng của mô-đun theo dõi.

#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()

Mô-đun 'dấu vết' có giao diện dòng lệnh. Tất cả các chức năng trong mô-đun có thể được gọi bằng cách sử dụng công tắc dòng lệnh. Tùy chọn quan trọng nhất là --trace hiển thị các dòng chương trình khi chúng được thực thi. Trong ví dụ sau, một tùy chọn khác --ignore-dir Được sử dụng. Nó bỏ qua các thư mục được chỉ định trong khi tạo dấu vết.

E:\python37>python -m trace --ignore-dir=../lib --trace mymain.py

Đầu ra

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

--tài khoản tùy chọn tạo tệp cho mỗi mô-đun được sử dụng với phần mở rộng bìa.

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()

- bản tóm tắt tùy chọn hiển thị tóm tắt ngắn gọn nếu –count tùy chọn cũng được sử dụng.

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)

--file tùy chọn chỉ định tên của tệp trong đó số lượng tích lũy qua một số lần chạy theo dõi.

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 tùy chọn hiển thị các chức năng được gọi trong quá trình thực thi chương trình.

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

--calls tùy chọn được sử dụng cùng với tùy chọn –list funcs. Nó tạo ra các mối quan hệ gọi.

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