2014-09-04 16 views
10

so che posso usare questo per tracciare l'esecuzione del comando:traccia pitone: include solo alcuni file

python -m trace -t script.py 

Ma io voglio ridurre la potenza: solo i file che sono nel mio src/(PIP installare - e ...) dovrebbe essere mostrato.

Come posso fare questo?

risposta

7

La mia soluzione è basata sulla risposta di Brian Cain:

export PYTHONIOENCODING=utf-8 
python -m trace --ignore-dir=$HOME/lib64:$HOME/lib:/usr -t script.py 

mio virtualenv è direttamente in $ HOME e il mio codice è installato modificabile in $ HOME/src.

Questo PYTHONIOENCODING=utf-8; è necessario poiché ho ottenuto UnicodeErrors se ci sono caratteri non ascii nel codice python.

3

Come the documentation stati, è possibile utilizzare trace programmaticamente:

import sys 
import trace 

# create a Trace object, telling it what to ignore, and whether to 
# do tracing or line-counting or both. 
tracer = trace.Trace(
    ignoredirs=[sys.prefix, sys.exec_prefix], 
    trace=0, 
    count=1) 

# run the new command using the given tracer 
tracer.run('main()') 

# make a report, placing output in the current directory 
r = tracer.results() 
r.write_results(show_missing=True, coverdir=".") 

Annotare il argomento trace.Trace.

Sebbene non ci sia un modo per includere esplicitamente solo i file nello src, è possibile escludere tutti i pacchetti di sistema, che, a fini pratici, dovrebbero essere gli stessi.

+0

Ho pensato che questa soluzione inviasse i risultati a un file, ma in realtà stampasse su stdout, fantastico –

2

voglio ridurre la potenza

Non c'è nessun filtro whitelist, ma c'è una lista nera:

ignore_module:

--ignore-module = Ignora ciascuno di i nomi dei moduli dati e i suoi sottomoduli (se si tratta di un pacchetto). L'argomento può essere un elenco di nomi separati da una virgola.

4

Se si esegue lo script da bash si può usare qualcosa come:

python -m trace --ignore-dir=$(python -c 'import sys ; print ":".join(sys.path)[1:]') -t ./script.py 

In questo modo si può ignorare se si è o meno in un ambiente virtuale o di uno scenario più esoterica.

+0

Io uso sempre virtualenv, per me non è esoterico :-) ma la soluzione è un buon suggerimento su come farlo. Grazie. – guettli

+0

Sono d'accordo, "esoterico" era solo per altri scenari :-). – mop

+0

Funziona, ma intendevi 'join (sys.path [1:])' Penso :-) –