2014-12-04 2 views
4

следующие работы приятно видеть, что делает интерпретатор:трассировки выполнения путь питона переводчика

python -m trace --ignore-dir=$HOME/lib64:$HOME/lib:/usr -t path-to/script.py 

Но есть слишком много строк. Я хотел бы скрыть строки, которые происходят при импорте файла.

Пример: Я не заинтересован в очередях, как это:

saved_filter.py(9): class SavedFilter(models.Model): 
saved_filter.py(10):  name = models.TextField(max_length=256) 
saved_filter.py(11):  user = models.ForeignKey('auth.User', null=True, blank=True) 

я не мог найти решение в документации: https://docs.python.org/2/library/trace.html

Update Если есть другой способ, чтобы получить в результате, например, другой пакет python (а не трассировка), это было бы хорошим решением.

Обновление 2 Трассировка должна быть неинтерактивной.

Update 3

Я попробовал решение, предложенное Мартином v. Löwis. Он работает в некоторых случаях, но не для всех.

файл foo.py

import bar 

def main(): 
    f=bar.Foo() 
    f.my_func() 

if __name__=='__main__': 
    main() 

файл bar.py

class Foo(object): 
    def my_func(self): 
     def inner(): 
      print('#in inner') 
      return 'inner' 
     print('#in my_func()') 
     inner() 
     return 1 

Если я позвоню foo.py, разыскиваемый результат выглядит примерно так:

foo.py: е = bar.Foo() foo.py: f.my_func() bar.py: print ('# in my_func()') bar.py: internal() bar.py: print ('# in inner «) bar.py: возвращение 'внутренний' bar.py: возвращение 1

Результат trace2.py

> python tmp/trace2-orig.py --trace tmp/foo.py 
--- modulename: foo, funcname: <module> 
--- modulename: bar, funcname: <module> 
--- modulename: bar, funcname: Foo 
bar.py(1): class Foo(object):    <======= Import lines 
bar.py(2):  def my_func(self): 
--- modulename: foo, funcname: main 
foo.py(4):  f=bar.Foo() 
foo.py(5):  f.my_func() 
--- modulename: bar, funcname: my_func 
bar.py(3):   def inner(): 
bar.py(6):   print('#in my_func()') 
#in my_func() 
bar.py(7):   inner() 
--- modulename: bar, funcname: inner 
bar.py(4):    print('#in inner') 
#in inner 
bar.py(5):    return 'inner' 
bar.py(8):   return 1 
--- modulename: trace, funcname: _unsettrace 
trace.py(80):   sys.settrace(None) 

К сожалению, есть еще class Foo(object) что-то выполняется в процессе импорта.

Я предполагаю, что обнаружение загрузки и выполнения кода не распространяется на все случаи.

+1

Попытайтесь собрать информацию по [Метод объекта трассировки] (https://docs.python.org/2/library/trace.html#trace.Trace.runctx), чтобы вызвать внутри вашего скрипта, чтобы собирать информацию о вашей целевой функции и напечатать данные [CoverageResults] (https://docs.python.org/2/library/trace.html#trace.CoverageResults) aftert hat. –

ответ

0

Вы можете использовать pdb library, используя эту библиотеку, вы можете сделать контрольную точку и/или вводить операторы python в строку точки разрыва с помощью пользовательского интерфейса интерактивной консоли и выполнять другие действия. ;)

+0

Я обновил вопрос: трассировка должна быть неинтерактивной. AFAIK pdb предназначен для интерактивной отладки. Скажите, пожалуйста, если я что-то упустил. – guettli

0

Если вы просто хотите, чтобы скрыть пути кода во время импорта, просто конвейеру через фильтр, как этот:

import re 
import sys 

cur = None 
skip_re = re.compile(r'^(?P<filename>.+)?\((\d*)\):\s*import') 
for line in sys.stdin: 
    if cur and not line.startswith(cur): 
     continue 
    cur = None 
    match = skip_re.match(line) 
    if match: 
     cur = match.group('filename') 
    sys.stdout.write(line) 
+0

Да, может работать. Но довольно «грязный». Спасибо, тем не менее. – guettli

1

При создании trace2.py сценария как

import trace 

OrigTrace = trace.Trace 
class Trace2(trace.Trace): 
    def localtrace_trace(self, frame, why, arg): 
     if why == "line" and frame.f_code.co_name == '<module>': 
      return self.localtrace 
     return OrigTrace.localtrace_trace(self, frame, why, arg) 

trace.Trace=Trace2 
trace.main() 

и запустите python -m trace2 -t script.py, вы не увидите вывод трассировки строк, находящихся на уровне модуля.

+0

спасибо. Я попробовал ваше решение. Он еще не улавливает все случаи загрузки кода. См. Обновленный вопрос. – guettli

Смежные вопросы