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.

0

5 Answers 5

4

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):
Sign up to request clarification or add additional context in comments.

Comments

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.

Comments

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

1 Comment

Do you think the OP really wants to write explicit print statements?
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"

1 Comment

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.
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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.