•  


GitHub - cool-RR/PySnooper: Never use print for debugging again
Skip to content

cool-RR/PySnooper

Repository files navigation

PySnooper - Never use print for debugging again

PySnooper is a poor man's debugger. If you've used Bash, it's like set -x for Python, except it's fancier.

Your story: You're trying to figure out why your Python code isn't doing what you think it should be doing. You'd love to use a full-fledged debugger with breakpoints and watches, but 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.

What makes PySnooper stand out from all other code intelligence tools? You can use it in your shitty, sprawling enterprise codebase without having to do any setup. Just slap the decorator on, as shown below, and redirect the output to a dedicated log file by specifying its path as the first argument.

Example

We're writing a function that converts a number to binary, by returning a list of bits. Let's snoop on it by adding the @pysnooper.snoop() decorator:

import
 pysnooper


@
pysnooper
.
snoop
()

def
 number_to_bits
(
number
):
    
if
 number
:
        
bits
 =
 []
        
while
 number
:
            
number
, 
remainder
 =
 divmod
(
number
, 
2
)
            
bits
.
insert
(
0
, 
remainder
)
        
return
 bits

    else
:
        
return
 [
0
]

number_to_bits
(
6
)

The output to stderr is:

Or if you don't want to trace an entire function, you can wrap the relevant part in a with block:

import
 pysnooper

import
 random


def
 foo
():
    
lst
 =
 []
    
for
 i
 in
 range
(
10
):
        
lst
.
append
(
random
.
randrange
(
1
, 
1000
))

    
with
 pysnooper
.
snoop
():
        
lower
 =
 min
(
lst
)
        
upper
 =
 max
(
lst
)
        
mid
 =
 (
lower
 +
 upper
) 
/
 2

        print
(
lower
, 
mid
, 
upper
)

foo
()

which outputs something like:

New var:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line        10         lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line        11         upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line        12         mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line        13         print(lower, mid, upper)
Elapsed time: 00:00:00.000344

Features

If stderr is not easily accessible for you, you can redirect the output to a file:

@
pysnooper
.
snoop
(
'/my/log/file.log'
)

You can also pass a stream or a callable instead, and they'll be used.

See values of some expressions that aren't local variables:

@
pysnooper
.
snoop
(
watch
=
(
'foo.bar'
, 
'self.x["whatever"]'
))

Show snoop lines for functions that your function calls:

@
pysnooper
.
snoop
(
depth
=
2
)

See Advanced Usage for more options. <------

Installation with Pip

The best way to install PySnooper is with Pip:

$ 
pip install pysnooper

Other installation options

Conda with conda-forge channel:

$ 
conda install -c conda-forge pysnooper

Arch Linux:

$ 
yay -S python-pysnooper

Fedora Linux:

$ 
dnf install python3-pysnooper

Citing PySnooper

If you use PySnooper in academic work, please use this citation format:

@software
{
rachum2019pysnooper
,
    
title
=
{
PySnooper: Never use print for debugging again
}
,
    
author
=
{
Rachum, Ram and Hall, Alex and Yanokura, Iori and others
}
,
    
year
=
{
2019
}
,
    
month
=
{
jun
}
,
    
publisher
=
{
PyCon Israel
}
,
    
doi
=
{
10.5281/zenodo.10462459
}
,
    
url
=
{
https://github.com/cool-RR/PySnooper
}

}

License

Copyright (c) 2019 Ram Rachum and collaborators, released under the MIT license.

Media Coverage

Hacker News thread and /r/Python Reddit thread (22 April 2019)

- "漢字路" 한글한자자동변환 서비스는 교육부 고전문헌국역지원사업의 지원으로 구축되었습니다.
- "漢字路" 한글한자자동변환 서비스는 전통문화연구회 "울산대학교한국어처리연구실 옥철영(IT융합전공)교수팀"에서 개발한 한글한자자동변환기를 바탕하여 지속적으로 공동 연구 개발하고 있는 서비스입니다.
- 현재 고유명사(인명, 지명등)을 비롯한 여러 변환오류가 있으며 이를 해결하고자 많은 연구 개발을 진행하고자 하고 있습니다. 이를 인지하시고 다른 곳에서 인용시 한자 변환 결과를 한번 더 검토하시고 사용해 주시기 바랍니다.
- 변환오류 및 건의,문의사항은 juntong@juntong.or.kr로 메일로 보내주시면 감사하겠습니다. .
Copyright ⓒ 2020 By '전통문화연구회(傳統文化硏究會)' All Rights reserved.
 한국   대만   중국   일본