Ce face sys.settrace(), setprofile() și call_tracing()
settrace(f) înregistrează o funcție apelată de interpretor la evenimente: 'call' (intrare în funcție), 'line' (rând nou), 'return', 'exception'. Depanatorul pdb și instrumentele de acoperire a codului funcționează așa. setprofile(f) primește doar apelurile și ieșirile din funcții (inclusiv cele scrise în C), fiind mai rapid; așa lucrează cProfile.
gettrace() și getprofile() returnează funcțiile curente. call_tracing(f, args) apelează f(*args) cu urmărirea activă, chiar dacă este apelat din interiorul unei funcții de urmărire. Din Python 3.12, sys.monitoring oferă o alternativă mai rapidă.
Parametri
| Parametru | Descriere |
|---|---|
functie |
Funcția (frame, eveniment, argument), sau None pentru oprire. |
Ce returnează
gettrace/getprofile: funcția curentă sau None.
Exemple
Exemplul 1: Urmărirea apelurilor
import sys
def urmaritor(frame, eveniment, arg):
if eveniment in ("call", "return") and frame.f_code.co_name in ("aduna", "dublu"):
print(eveniment, frame.f_code.co_name, arg if eveniment == "return" else "")
return urmaritor
def dublu(x):
return 2 * x
def aduna(a, b):
return dublu(a) + b
sys.settrace(urmaritor)
aduna(3, 4)
sys.settrace(None)
print(sys.gettrace())
apeluri = []
sys.setprofile(lambda frame, ev, arg: apeluri.append(frame.f_code.co_name) if ev == "call" else None)
print(sys.call_tracing(aduna, (1, 1)))
sys.setprofile(None)
print(apeluri, sys.getprofile())
Rezultat
call aduna
call dublu
return dublu 6
return aduna 10
None
3
['aduna', 'dublu'] None
Greșeli frecvente
- Lași activă o funcție de urmărire costisitoare: programul devine de zeci de ori mai lent. Oprește-o cu
sys.settrace(None).
Comenzi înrudite
breakpoint(): Oprește programul în acel punct și pornește depanatorul (pdb), ca să inspectezi variabilele.sys.audit() și sys.addaudithook(): Evenimente de audit: află când programul deschide fișiere, pornește procese sau face alte operații sensibile.