sys.settrace(), setprofile() și call_tracing() în Python

Interpretorul (sys) Python 3.0+

Funcții apelate de interpretor la fiecare apel sau rând de cod, baza depanatoarelor și profilerelor.

Sintaxă
sys.settrace(functie) / sys.gettrace()
sys.setprofile(functie) / sys.getprofile()
sys.call_tracing(functie, argumente)

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.