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.
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.
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):
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
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"
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.