Программные средства очищения для Пайтона

В Пайтоне существуют какие-то книжные магазины, чтобы отлаживать код как cProfile где ты можешь продолжать разметку выполнения программы как например:

import cProfile, pstats, StringIO
pr = cProfile.Profile()
pr.enable()

# Nuestro código
result = [i for i in range(10)]

print(result)
pr.disable()
s = StringIO.StringIO()
sortby = 'cumulative'
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
print s.getvalue()

Он дал бы нам как результат:

   2 function calls in 0.000 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 {range}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Но мне хотелось бы знать: какие книжные магазины или программные средства существуют для следования разгрузки выполнения сложной программы, где существуют сотни или тысячи выполнение более простого способа?

7
задан 22.04.2016, 23:23
2 ответа

Это может быть соединенным прямо с личными выборами, я буду упоминать о debugger, который приходит по умолчанию в Пайтоне, и в конце концов оставлю тебе список других debuggers для того, чтобы ты протестировал их и выбрал того, который подходит тебе больше.

Пайтон Дебуггер

У Пайтона есть, если сам так называемый Debugger pdb. Ты это используешь, как ты использовал бы breakpoints внутри твоего кода, а именно, можешь использовать это, где ты нуждаешься в этом, и все разы хоти.

Форма более общего использования - посредством функции pdb.set_trace(). Считай следующий рукописный шрифт примера:

# test.py
lista = range(4, 10)
for elemento in lista:
    import pdb; pdb.set_trace()
    elemento **= 2

Выполнив это:

$ python test.py

Ты увидишь что-то этим:

> /home/cesar/Desktop/test/test.py(5)<module>()
-> elemento **= 2
(Pdb)

После того, как видели (Pdb) он показывает тебе, что задержалось выполнение программы и - в ожидании какой-то команды очищения:

(Pdb)

Предыдущая линия в (Pdb) он показывает тебе линию, которая будет выполнен далее:

> /home/cesar/Desktop/test/test.py(4)<module>()
-> elemento **= 2

Что равняется линии 4 из твоего рукописного шрифта. Перед тем, как продолжать, ты можешь видеть доступные команды нажимая h или ?:

(Pdb) h
Documented commands (type help <topic>):
========================================
EOF    bt         cont      enable  jump  pp       run      unt   
a      c          continue  exit    l     q        s        until 
alias  cl         d         h       list  quit     step     up    
args   clear      debug     help    n     r        tbreak   w     
b      commands   disable   ignore  next  restart  u        whatis
break  condition  down      j       p     return   unalias  where 

Miscellaneous help topics:
==========================
exec  pdb

Undocumented commands:
======================
retval  rv

(Pdb) 

Мы не будем входить в деталь на всех командах, которые могут быть использованными, только каких-либо основные. Например, команда n или next он позволяет тебе выполнять следующую линию кода, который в этом случае был бы elemento **= 2:

(Pdb) n
> /home/cesar/Desktop/test/test.py(2)<module>()
-> for elemento in lista:
(Pdb) 

Он заканчивается выполнять линию elemento **= 2 и, следовательно, мы могли бы иметь доступ к Вашей стоимости, также к стоимости списка, который был определен изначально, в действительности, в любую переменную, которая была бы определена до этого момента:

(Pdb) elemento
16
(Pdb) lista
[4, 5, 6, 7, 8, 9]
(Pdb) 

Команда n будешь пребывать в следующей линии даже, если эта содержит функцию. Считай сейчас следующий рукописный шрифт, который использует функцию, чтобы возвращать силу числа:

# test.py
def potencia(base, exponente):
    return base ** exponente

lista = range(4, 10)
for elemento in lista:
    import pdb; pdb.set_trace()
    elemento = potencia(elemento, 2)

Выполнив ее:

$ python test.py
> /home/cesar/Desktop/test/test.py(7)<module>()
-> elemento = potencia(elemento, 2)
(Pdb) 

Ощутись, что следующая линия, которая будет выполнена, - вызов функция potencia, если мы используем n будешь выполнять функцию и возвращаться к следующей линии, которая является следующим повторением for:

> /home/cesar/Desktop/test/test.py(5)<module>()
-> for elemento in lista:
(Pdb)

Но: какой изюм, если мы хотим узнать то, что выполняет функцию potencia? Для этого мы можем использовать команду s или step, эта команда продолжит внутри первой линии функции, которой она была названа. Если мы выполняем снова:

$ python test.py
> /home/cesar/Desktop/test/test.py(7)<module>()
-> elemento = potencia(elemento, 2)
(Pdb) s
--Call--
> /home/cesar/Desktop/test/test.py(1)potencia()
-> def potencia(base, exponente):
(Pdb) n
> /home/cesar/Desktop/test/test.py(2)potencia()
-> return base ** exponente

Потом у нас есть команда c или continue, что, как он говорит Ваше имя, продолжает с выполнением программы, но так как мы внутри одного for будешь продолжать до тех пор, пока он не закончит повторять каждый элемент. Следовательно:

$ python test.py
> /home/cesar/Desktop/test/test.py(7)<module>()
-> elemento = potencia(elemento, 2)
(Pdb) c
> /home/cesar/Desktop/test/test.py(6)<module>()
-> import pdb; pdb.set_trace()
(Pdb) c
> /home/cesar/Desktop/test/test.py(7)<module>()
-> elemento = potencia(elemento, 2)
(Pdb) c
> /home/cesar/Desktop/test/test.py(6)<module>()
-> import pdb; pdb.set_trace()
(Pdb) c
> /home/cesar/Desktop/test/test.py(7)<module>()
-> elemento = potencia(elemento, 2)
(Pdb) c
> /home/cesar/Desktop/test/test.py(6)<module>()
-> import pdb; pdb.set_trace()
(Pdb) c
$

Чтобы заканчиваться, я думаю, что он необходим также знать команду q или quit что заканчивает выполнение debugger и программа преждевременная:

$ python test.py
> /home/cesar/Desktop/test/test.py(7)<module>()
-> elemento = potencia(elemento, 2)
(Pdb) q
Traceback (most recent call last):
  File "test.py", line 7, in <module>
    elemento = potencia(elemento, 2)
  File "test.py", line 7, in <module>
    elemento = potencia(elemento, 2)
  File "/usr/lib/python2.7/bdb.py", line 49, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python2.7/bdb.py", line 68, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit
$

Для большего детали на командах очищения ты можешь видеть секцию Дебугхер Коммандс.

Пайтон Дебуггер (с autocomplete)

В самом деле, pdb признай, когда ты нажимаешь Tab, но только он ограничивается тем, чтобы показать тебе список команд. Считай следующий рукописный шрифт:

# test.py
var_a = 10
var_b = [1, 3, 5, 7 ,9]
var_c = 'prueba'
import pdb; pdb.set_trace()

Выполнив:

$ python test.py
> /home/cesar/Desktop/test/test.py(4)<module>()->None
-> import pdb; pdb.set_trace()
(Pdb) [TAB][TAB]
EOF        cl         disable    jump       quit       step       whatis
a          clear      down       l          r          tbreak     where
alias      commands   enable     list       restart    u          
args       condition  exit       n          return     unalias    
b          cont       h          next       retval     unt        
break      continue   help       p          run        until      
bt         d          ignore     pp         rv         up         
c          debug      j          q          s          w          
(Pdb) var_a
10
(Pdb) var_a.[TAB][TAB][TAB]

Оно не функционирует, чтобы видеть методы целой переменной var_a. Существует truquito используя книжный магазин rlcompleter. Измененная версия рукописного шрифта:

# test.py
import pdb
import rlcompleter

pdb.Pdb.complete = rlcompleter.Completer(locals()).complete

var_a = 10
var_b = [1, 3, 5, 7 ,9]
var_c = 'prueba'
pdb.set_trace()

Выполнив:

$ python test.py
> /home/cesar/Desktop/test/test.py(9)<module>()->None
-> pdb.set_trace()
(Pdb) var_a
10
(Pdb) var_a.[TAB][TAB]
var_a.__abs__(           var_a.__lshift__(        var_a.__rpow__(
var_a.__add__(           var_a.__mod__(           var_a.__rrshift__(
var_a.__and__(           var_a.__mul__(           var_a.__rshift__(
var_a.__class__(         var_a.__neg__(           var_a.__rsub__(
var_a.__cmp__(           var_a.__new__(           var_a.__rtruediv__(
var_a.__coerce__(        var_a.__nonzero__(       var_a.__rxor__(
var_a.__delattr__(       var_a.__oct__(           var_a.__setattr__(
var_a.__div__(           var_a.__or__(            var_a.__sizeof__(
var_a.__divmod__(        var_a.__pos__(           var_a.__str__(
var_a.__doc__            var_a.__pow__(           var_a.__sub__(
var_a.__float__(         var_a.__radd__(          var_a.__subclasshook__(
var_a.__floordiv__(      var_a.__rand__(          var_a.__truediv__(
var_a.__format__(        var_a.__rdiv__(          var_a.__trunc__(
var_a.__getattribute__(  var_a.__rdivmod__(       var_a.__xor__(
var_a.__getnewargs__(    var_a.__reduce__(        var_a.bit_length(
var_a.__hash__(          var_a.__reduce_ex__(     var_a.conjugate(
var_a.__hex__(           var_a.__repr__(          var_a.denominator
var_a.__index__(         var_a.__rfloordiv__(     var_a.imag
var_a.__init__(          var_a.__rlshift__(       var_a.numerator
var_a.__int__(           var_a.__rmod__(          var_a.real
var_a.__invert__(        var_a.__rmul__(          
var_a.__long__(          var_a.__ror__(           
(Pdb) var_b
[1, 3, 5, 7, 9]
(Pdb) var_b.[TAB][TAB]
var_b.__add__(           var_b.__iadd__(          var_b.__setattr__(
var_b.__class__(         var_b.__imul__(          var_b.__setitem__(
var_b.__contains__(      var_b.__init__(          var_b.__setslice__(
var_b.__delattr__(       var_b.__iter__(          var_b.__sizeof__(
var_b.__delitem__(       var_b.__le__(            var_b.__str__(
var_b.__delslice__(      var_b.__len__(           var_b.__subclasshook__(
var_b.__doc__            var_b.__lt__(            var_b.append(
var_b.__eq__(            var_b.__mul__(           var_b.count(
var_b.__format__(        var_b.__ne__(            var_b.extend(
var_b.__ge__(            var_b.__new__(           var_b.index(
var_b.__getattribute__(  var_b.__reduce__(        var_b.insert(
var_b.__getitem__(       var_b.__reduce_ex__(     var_b.pop(
var_b.__getslice__(      var_b.__repr__(          var_b.remove(
var_b.__gt__(            var_b.__reversed__(      var_b.reverse(
var_b.__hash__           var_b.__rmul__(          var_b.sort(
(Pdb) var_c
'prueba'
(Pdb) var_c.[TAB][TAB]
var_c.__add__(                      var_c.decode(
var_c.__class__(                    var_c.encode(
var_c.__contains__(                 var_c.endswith(
var_c.__delattr__(                  var_c.expandtabs(
var_c.__doc__                       var_c.find(
var_c.__eq__(                       var_c.format(
var_c.__format__(                   var_c.index(
var_c.__ge__(                       var_c.isalnum(
var_c.__getattribute__(             var_c.isalpha(
var_c.__getitem__(                  var_c.isdigit(
var_c.__getnewargs__(               var_c.islower(
var_c.__getslice__(                 var_c.isspace(
var_c.__gt__(                       var_c.istitle(
var_c.__hash__(                     var_c.isupper(
var_c.__init__(                     var_c.join(
var_c.__le__(                       var_c.ljust(
var_c.__len__(                      var_c.lower(
var_c.__lt__(                       var_c.lstrip(
var_c.__mod__(                      var_c.partition(
var_c.__mul__(                      var_c.replace(
var_c.__ne__(                       var_c.rfind(
var_c.__new__(                      var_c.rindex(
var_c.__reduce__(                   var_c.rjust(
var_c.__reduce_ex__(                var_c.rpartition(
var_c.__repr__(                     var_c.rsplit(
var_c.__rmod__(                     var_c.rstrip(
var_c.__rmul__(                     var_c.split(
var_c.__setattr__(                  var_c.splitlines(
var_c.__sizeof__(                   var_c.startswith(
var_c.__str__(                      var_c.strip(
var_c.__subclasshook__(             var_c.swapcase(
var_c._formatter_field_name_split(  var_c.title(
var_c._formatter_parser(            var_c.translate(
var_c.capitalize(                   var_c.upper(
var_c.center(                       var_c.zfill(
var_c.count(                        

Ну, это уже помогает немного больше заданию debugging.

Другие программные средства:

Ты можешь консультировать список Пайтона Дебуггерс на официальной странице Пайтона:

8
ответ дан 24.11.2019, 14:32
  • 1
    Супер дополнительный ответ re против превосходно documented! Excellente. –  Jorgesys♦ 22.04.2016, 23:22
  • 2
    Спасибо @Elenasys;-) –  César 22.04.2016, 23:41

У PuDB есть хорошая репутация:

https://pypi.python.org/pypi/pudb

Надеялся, что то, в чем ты нуждаешься.

2
ответ дан 24.11.2019, 14:32

Теги

Похожие вопросы