Using PySnooper for Python Debugging
Updated by Benjo
When your Python code doesn’t run as expected or when you want to examine if your program is running correctly, you may use a full-fledged debugger with breakpoints and watches. But in some cases, you can’t be bothered to set one up right now.
You want to know which lines are running and which aren’t, and what the values of the local variables are.
Most people would use print lines, in strategic locations, some of them showing the values of variables.
PySnooper lets you do the same, except instead of carefully crafting the right print lines, you just add one decorator line to the function you’re interested in. You’ll get a play-by-play log of your function, including which lines ran and when, and exactly when local variables were changed.
Install PySnooper using pip
pip install pysnooper
conda install -c conda-forge pysnooper
Here is an example how PySnooper works. Let say you have a function to sum up to the
n. Let’s snoop on it by adding the
import pysnooper @pysnooper.snoop() def sum_up(number): s = 0 for i in range(1, number+1): s += i return s print(sum_up(10))
The output to the console is:
Starting var:.. number = 5 14:52:25.242890 call 5 def sum_up(number): 14:52:25.243049 line 6 s = 0 New var:....... s = 0 14:52:25.244005 line 7 for i in range(1, number + 1): New var:....... i = 1 14:52:25.244005 line 8 s += i Modified var:.. s = 1 14:52:25.244983 line 7 for i in range(1, number + 1): Modified var:.. i = 2 14:52:25.244983 line 8 s += i Modified var:.. s = 3 14:52:25.251813 line 7 for i in range(1, number + 1): Modified var:.. i = 3 14:52:25.254806 line 8 s += i Modified var:.. s = 6 14:52:25.272309 line 7 for i in range(1, number + 1): Modified var:.. i = 4 14:52:25.275238 line 8 s += i Modified var:.. s = 10 14:52:25.278208 line 7 for i in range(1, number + 1): Modified var:.. i = 5 14:52:25.280118 line 8 s += i Modified var:.. s = 15 14:52:25.281806 line 7 for i in range(1, number + 1): 14:52:25.282758 line 10 return s 14:52:25.284699 return 10 return s Return value:.. 15 15
Or if you don’t want to trace an entire function, you can wrap the relevant part in a with block:
import pysnooper def average(number): s = 0 for i in range(1, number + 1): s += i with pysnooper.snoop(): avg = s / number return avg print(average(5))
New var:....... number = 5 New var:....... s = 15 New var:....... i = 5 14:57:20.398242 line 10 avg = s / number New var:....... avg = 3.0 14:57:20.410059 line 12 return avg 3.0
You can redirect the output to a file:
Add prefix to snoop lines
Using PySnooper for debugging makes it easier than using multiple
- How to Check String Contains Substring Python
- Receive and Send Gmail Using Python
- Find all text files in a directory with extension .txt in Python
- How to iterate over files in directory python
- How to sort list of dictionary by value python
- Sort Python dictionary by value
- 6 ways to call external command in python
- Getting started with PyTorch
- Convert string representation of list to Python list
- Determine the type of a python object