2012-10-31 8 views
15

Sto usando pycallgraph dalla riga di comando per tracciare il profilo e disegnare il grafico della chiamata di un programma relativamente semplice. Tuttavia, l'immagine risultante include le parti interne delle librerie standard (threading, json, socket) anche se non utilizzo l'opzione della riga di comando -s. L'utilizzo dell'opzione -e per escludere quei moduli non ha alcun effetto e l'utilizzo di -i comporta un grafico delle chiamate vuoto. Ho anche provato cProfile, ma solo grafici il thread principale.Come evitare che il Pycallgraph possa accedere alle funzioni della libreria standard?

Come posso fare in modo che il pycallgraph mostri solo le chiamate nel mio codice? L'attuale risultato disordinato è inutile.

Modifica: Sto usando 0.5.1, disponibile tramite easy_install. L'esecuzione di pycallgraph ./cursesclient.py restituisce questo valore: a messy call graph. Come puoi vedere, pycallgraph mostra l'interno dei moduli json, re, encodings, socket e threading. Re e codifiche non sono mai nemmeno chiamate direttamente nel mio codice, ma attraverso json e socket, rispettivamente.

+0

comunque, grazie per avermi indicato a pycallgraph. –

+0

quale versione usi? In 0.5.1 posso creare grafici con solo le mie funzioni chiamando semplicemente 'pycallgraph mycode.py', ma l'opzione '-s' ignora alcuni moduli come 'functools' – adray

risposta

5

pycallgraph ha un metodo stop_trace() non documentato che è possibile utilizzare per escludere sezioni di codice. Qualcosa come

import pycallgraph 
import mycode 
import stuff_i_dont_want_to_see 

pycallgraph.start_trace() 
#Initializations 

pycallgraph.stop_trace() 
stuff_i_dont_want_to_see() 
pycallgraph.start_trace() 

mycode.things() 
pycallgraph.make_dot_graph('cleaner_graph.png') 

E 'questo quello che cerchi?

source

+2

Digitando che praticamente si ottiene ciò che volevo, ma è noioso avvolgere tutte le chiamate standard alle librerie per evitare di tracciare e profilare grafici; specialmente perché, secondo la linea di comando di pycallgraph, non dovrebbe disegnare grafici per impostazione predefinita. Tuttavia, dato che è passato quasi un mese, accetterò la risposta in assenza di alternative migliori. – andyn

10

Pycallgraph fornisce funzionalità di filtraggio per filtrare qualsiasi modulo, classe o funzione che si desidera escludere dal grafico delle chiamate. Dopo la funzione dovrebbe essere definita prima di iniziare la traccia e passato a pycallgraph

Esempio

def filtercalls(call_stack, modul, clas, func, full): 
    mod_ignore = ['shutil','scipy.optimize','re','os','sys','json'] 
    func_ignore = ['CustomFunctionName','pdbcall'] 
    clas_ignore = ['pdb'] 
    return modul not in mod_ignore and func not in func_ignore and clas not in clas_ignore 

L'inizio pycallgraph traccia è

pycallgraph.start_trace(filter_func=filtercalls) 

In questo modo, qualsiasi modulo, classe o funzione da Lei forniti nel i filtri verranno rimossi. Notare che molte volte nelle librerie standard che forniscono solo il nome del modulo non sono sufficienti. Quindi, includendo numpy in mod_ignore risulterà comunque in numpy.core incluso

+3

Dovrebbe essere probabilmente la risposta corretta poiché fa quello che l'OP chiedeva, limitando il threading ad esempio potrebbe non essere nemmeno possibile senza eliminare la propria istanza di Thread e usando la risposta 'corretta' – CrackerJack9

Problemi correlati