How to print commands in Python?
Question: 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 <http://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.


Answer: To make the interpreter print out expression values during runtime you can use
the [print](http://docs.python.org/2/reference/simple_stmts.html#print)
statement. Also take a note of Python's [string formatting
facilities](http://stackoverflow.com/q/5082452/1025391).

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](http://docs.python.org/2/library/trace.html) 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](http://docs.python.org/2/library/pdb.html). 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](http://pydev.org/)) have nicely integrated
debugging functionality. So my suggestion: go and get a debugger.

