import sys def outer(): x = 0 def traced_looper(): # Force w_locals to be instantiated (only matters on PyPy; on CPython # you can comment this line out and everything stays the same) locals() # Force x to be closed over (could use 'nonlocal' on py3) if False: x yield traced_looper while True: x += 1 yield "value of x is: %d" % (x,) outer_generator = outer() traced_looper = outer_generator.next() def tracefunc(frame, event, arg): print(outer_generator.next()) return tracefunc sys.settrace(tracefunc) traced_looper() sys.settrace(None)