2

I'm not in the programming area but I recently got interested in Python. I was writing some functions but for debugging I need to see what commands are running. For instance:

def foo():
    for i in xrange(0,5):
        a = 1 + i

Is it possible to make the interpreter output

>>> for i in xrange(0,5)
>>> a = 1 + 0
>>> a = 1 + 1
>>> a = 1 + 2
>>> a = 1 + 3
>>> a = 1 + 4

For

>>> foo()

Or at least write to a file what is happening? I did some scripting in the past and I remember that this was possible in DOS, using @ECHO ON or something. I did some reading and I feel like it's related to stdin and stdout in Python so I tried

import sys
def foo():
    for i in xrange(0,5):
        a = 1 + i
        sys.stdin.flush()
        sys.stdout.flush()

But I get nothing... I also tried

import sys
# foo()
sys.stdin.read()
sys.stdout.read()

and https://stackoverflow.com/a/3289051/2032568, but it just hangs. Sorry if this is not the right place for beginners. I couldn't find anything that answers my question.

Community
  • 1
  • 1
  • You might think your question is clear but your comments below seem to me to indicate that your question is something entirely different than what you actually asked. Maybe you could edit your question and make it a little more clear. Do you want some kind of thing that actually shows all intermediate steps required to evaluate an expression, almost like someone introducing algebraic expressions in math class? – Warren P Apr 14 '13 at 20:19

5 Answers5

4

To make the interpreter print out expression values during runtime you can use the print statement. Also take a note of Python's string formatting facilities.

Example:

for i in xrange(0,5):
    a = 1 + i
    # print the value of a:
    print "the current value of variable 'a':", a

There is no need to flush stdout explicitly, unless you want to enforce to print out lines without a terminating newline:

import sys
import time
for i in xrange(0,5):
    a = 1 + i
    # print the value of a:
    # the trailing comma prevents 'print' from adding a newline
    print "\rthe current value of variable 'a':", a, 
    sys.stdout.flush()
    # short pause for purposes of demonstration
    time.sleep(1)
# finally print a newline
print

To print each statement before it's executed have a look at the trace module.

Example:

y = 0
for xi in range(3):
    y += xi
print y

The output:

$ python -m trace -t tt.py
 --- modulename: tt, funcname: <module>
tt.py(2): y = 0
tt.py(3): for xi in range(3):
tt.py(4):     y += xi
tt.py(3): for xi in range(3):
tt.py(4):     y += xi
tt.py(3): for xi in range(3):
tt.py(4):     y += xi
tt.py(3): for xi in range(3):
tt.py(5): print y
3
 --- modulename: trace, funcname: _unsettrace
trace.py(80):         sys.settrace(None)

What you are looking for in the first place, might also be a debugger, e.g. pdb. You get an interactive session, where you can step through the code, and have a look at the data interactively.

Example:

$ python -m pdb tt.py
> /home/moooeeeep/tt.py(2)<module>()
-> y = 0
(Pdb) n
> /home/moooeeeep/tt.py(3)<module>()
-> for xi in range(3):
(Pdb) n
> /home/moooeeeep/tt.py(4)<module>()
-> y += xi
(Pdb) n
> /home/moooeeeep/tt.py(3)<module>()
-> for xi in range(3):
(Pdb) n
> /home/moooeeeep/tt.py(4)<module>()
-> y += xi
(Pdb) print y, xi
0 1
(Pdb) 
...

Most Python IDEs (e.g., PyDev) have nicely integrated debugging functionality. So my suggestion: go and get a debugger.

Community
  • 1
  • 1
moooeeeep
  • 30,004
  • 18
  • 92
  • 173
3

Have a look at the trace-module

python -m trace --count -C . somefile.py

output is placed in currebt directory:

$ cat somefile.trace
    1: def foo():
    6:     for i in xrange(5):
    5:         a = 1 + i

    1: foo()

-c, --count Produce a set of annotated listing files upon program completion that shows how many times each statement was executed

If using the -t option you get this:

$ python -m trace --count -t tr.py 
 --- modulename: tr, funcname: <module>
tr.py(1): def foo():
tr.py(5): foo()
 --- modulename: tr, funcname: foo
tr.py(2):     for i in xrange(5):
tr.py(3):         a = 1 + i
tr.py(2):     for i in xrange(5):
tr.py(3):         a = 1 + i
tr.py(2):     for i in xrange(5):
tr.py(3):         a = 1 + i
tr.py(2):     for i in xrange(5):
tr.py(3):         a = 1 + i
tr.py(2):     for i in xrange(5):
tr.py(3):         a = 1 + i
tr.py(2):     for i in xrange(5):
Fredrik Pihl
  • 42,950
  • 7
  • 81
  • 128
1

You mean something like this?

def foo():
         for i in xrange(0,5):
                 a = 1 + i
                 print "a = 1 + {0}".format(i)

>>> foo()
a = 1 + 0
a = 1 + 1
a = 1 + 2
a = 1 + 3
a = 1 + 4
Ashwini Chaudhary
  • 232,417
  • 55
  • 437
  • 487
0
def foo():
    for i in xrange(0,5):
        a = 1 + i
        print a

i think this its what you are looking for, i hope this be usefull for you :)

edit:

i think i understood what you want:

def foo():
    for i in xrange(0,5):
        print "a = 1 + i"
Santiago
  • 67
  • 9
  • Sure, but if I have, say: a = (x ** y) + (2 * b), I'd like to get a = (-1 ** 2) + (2 * 2), for x=-1, y=2, b=2. Not only the result, which would be 4. – user2280382 Apr 14 '13 at 20:07
0

I understand what you what to achieve here and I checked that link: it hangs for me too, and only repeats inputted text in the Terminal. Unfortunately I don't know how to print out the script as you've asked: for debugging, I'd advise just using simple print commands to work out which section is being executed.

def foo():
    for i in xrange(0,5):
        a = 1 + i, print "line is being executed where i = %i " % i

Then just read the printed text output to see what the program is doing. Hope this helps.

Pythonidae
  • 106
  • 4