一个可怜的Python调试器。

PySnooper-g的Python项目详细描述


pysnooper-不再使用print进行调试

Travis CI

pysnooper是一个穷人的调试器。

您正试图找出为什么您的python代码没有做您认为应该做的事情。您很想使用一个完整的带有断点和监视点的调试器,但现在您不必费心设置一个断点和监视点。

您想知道哪些行正在运行,哪些没有运行,以及本地变量的值是什么。

大多数人会在战略位置使用print行,其中一些显示变量的值。

pysnooper允许您执行相同的操作,但您只需在感兴趣的函数中添加一个装饰符行,而不是仔细地绘制正确的print行。您将获得函数的逐行播放日志,包括运行的行数、运行的时间以及更改局部变量的确切时间。

是什么使pysnooper在所有其他代码智能工具中脱颖而出?你可以在你那肮脏的、杂乱无章的企业代码库中使用它,而不必做任何设置。只需打开decorator,如下所示,并通过将其路径指定为第一个参数将输出重定向到专用日志文件。

示例

我们正在编写一个函数,通过返回一个位列表,将数字转换为二进制。让我们通过添加@pysnooper.snoop()装饰器来窥探它:

importpysnooper@pysnooper.snoop()defnumber_to_bits(number):ifnumber:bits=[]whilenumber:number,remainder=divmod(number,2)bits.insert(0,remainder)returnbitselse:return[0]number_to_bits(6)

stderr的输出是:

Starting var:.. number = 6
15:29:11.327032 call         4 def number_to_bits(number):
15:29:11.327032 line         5     if number:
15:29:11.327032 line         6         bits = []
New var:....... bits = []
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
New var:....... remainder = 0
Modified var:.. number = 3
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
15:29:11.327032 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
15:29:11.327032 line         7         while number:
15:29:11.327032 line        10         return bits
15:29:11.327032 return      10         return bits
Return value:.. [1, 1, 0]

功能

如果您不容易访问stderr,可以将输出重定向到文件:

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

查看一些非局部变量的值:

@pysnooper.snoop(variables=('foo.bar','self.whatever'))

显示函数调用的函数的窥探行:

@pysnooper.snoop(depth=2)

用前缀开始所有窥探线,以便轻松地为它们添加grep:

@pysnooper.snoop(prefix='ZZZ ')

安装

$ pip install pysnooper

贡献

Pull requests永远欢迎! 请编写测试并用Tox运行它们。

tox自动安装所有依赖项。您只需要安装tox本身:

$ pip install tox

列出所有运行环境tox

$ tox -lv

如果要对所有目标python版本运行测试,请使用pyenv来安装它们。否则,你可以跑 只有绒布和您已经安装在机器上的绒布:

# run only some environments
$ tox -e flake8,pylint,bandit,py27,py36

在推送代码之前,linter和测试应该通过。他们将再次在特拉维斯·西身上执行任务。

许可证

版权所有(c)2019 Ram Rachum和合作者,根据麻省理工学院许可证发布。

我提供Development services in Python and Djangogive Python workshops教人 python和相关主题。

媒体报道

Hacker News thread 以及/r/Python Reddit thread(2019年4月22日)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java为什么我不能从ObjectInputStream读取ArrayList?   linux如何设置java时区?   java是一种拥有系统的方法。出来在循环中打印不同的内容?   scala Apache Spark:在Java中有效地使用mapPartitions   java Maven对com的依赖性。白天利用率   java将多个数据映射到单个id的表的正式名称是什么?   java如何在Android应用程序中隐藏FulterWave API键   SeleniumWebDriverJava:如何使用行号和列号单击表中的特定单元格   java Springbatch将数据从写入程序或处理器传递到RestConroller   java在Android TextView中一次换行两行,并带有跨距   java如何使这个rxjava zip并行运行?   JAVAutil。登录中。记录器不尊重java。util。登录中。数量   java无法将参数发布到服务器   java Eclipse:在自定义透视图/视图的状态行上显示作业进度   java在调用findAll()时,找到了多个具有给定标识符的行,但如果我使用findById()遍历所有条目,则可以工作;   Java中的正则表达式问题   Java中的实例变量   java如何在安卓中逐字搜索   java如何计算百分比