Does Python debugger step in generators?

2019-04-25 07:37发布

问题:

I am currently using NetBeans IDE with Jython 2.5.1

When debugging my project step by step, as soon as an iteration over a generator is encountered, the debugger goes straight to the end of the code. The output works ok, but it is impossible to do step by step debugging once the first generator is met.

Is this a standard behavior for Python debugging in all Python IDE? Is it not possible to debug the code "yield after yield" the same way we can debug VBA for each element of a "for" loop (sorry for the mention of VBA :)?

Thanks.

EDIT

Without the generator

Code:

def example(n):
i = 1
while i <= n:
    yield i
    i += 1

print "hello"

print "goodbye"

Output:

hello
goodbye

Debugging:

[LOG]PythonDebugger : overall Starting
[LOG]PythonDebugger.taskStarted : I am Starting a new Debugging Session ...
[LOG]This window is an interactive debugging context aware Python Shell 
[LOG]where you can enter python console commands while debugging 

(...)

>>>[stdout:]hello
>>>[stdout:]goodbye
Debug session normal end

With the Generator

Code:

def example(n):
    i = 1
    while i <= n:
        yield i
        i += 1

print "hello"

for n in example(3):
    print n

print "goodbye"

Output:

hello
1
2
3
goodbye

Debugging:

[LOG]PythonDebugger : overall Starting
[LOG]PythonDebugger.taskStarted : I am Starting a new Debugging Session ...
[LOG]This window is an interactive debugging context aware Python Shell 
[LOG]where you can enter python console commands while debugging 

(...)

>>>[stdout:]hello
>>>None['GeneratorExit
deamon ended
']

Debug session normal end

回答1:

I just tested eclipse and it will do debugging with pydev installed.



回答2:

I don't use NetBeans, but pdb at least does step through generators. For example:

$ cat test.py
def the_generator():
    for i in xrange(10):
        yield i

for x in the_generator():
    print x

$ python -mpdb test.py
> test.py(1)<module>()
-> def the_generator():
(Pdb) n
> test.py(5)<module>()
-> for x in the_generator():
(Pdb) s
--Call--
> test.py(1)the_generator()
-> def the_generator():
(Pdb) n
> test.py(2)the_generator()
-> for i in xrange(10):
(Pdb) n
> test.py(3)the_generator()
-> yield i
(Pdb) n
--Return--
> test.py(3)the_generator()->0
-> yield i
(Pdb) n
> test.py(6)<module>()
-> print x
(Pdb) n
0

If you post some code, we could try to figure out exactly what's going on in your case.