Skip to main content

一个帮助调试和监控 python 脚本的 Python 包

项目描述

siginfo是一个小型 Python 模块,可以方便地从正在运行的 Python 进程中获取状态或调试信息。

siginfo侦听SIGUSR1SIGUSR2 [ 1 ]信号并打印有关当前调用堆栈、局部变量等的信息。

用例

您有长时间运行的 Python 进程并希望检查进度,但不想一直打印进度。这对于 I/O 繁重的操作特别有用。

想象一下,您正在阅读一个大文件并逐行处理它。无需定期打印行号,您可以简单地从另一个 shell 会话发送 SIGUSR 命令并查看当前调用堆栈或启动交互式调试器。

如何

只需添加以下两行:

from siginfo import SiginfoBasic
SiginfoBasic()

到你的 python 脚本。应用程序运行后,您始终可以通过发送 SIGUSR 信号从另一个 shell 会话检查当前调用堆栈。

kill -SIGUSR1 ${pid}

它现在将带有所有局部变量的基本信息的当前调用堆栈打印到标准输出(或预定义文件)。

========================================================================================================================
LEVEL       0
METHOD      read_lines
LINE NUMBER:    33
------------------------------------------------------------------------------------------------------------------------
LOCALS
VARIABLE | TYPE            | VALUE
i        | int             | 1
fh       | TextIOWrapper   | <_io.TextIOWrapper name='many_rows.txt' mode='r' encoding='UTF-8'>
b        | int             | 15
a        | int             | 12
line     | str             | Row 1

------------------------------------------------------------------------------------------------------------------------
SCOPE   <code object read_lines at 0x108c30c90, file "long_script.py", line 24>
CALLER  <code object main2 at 0x108c309c0, file "long_script.py", line 21>
========================================================================================================================

========================================================================================================================
LEVEL       1
METHOD      main2
LINE NUMBER:    22
------------------------------------------------------------------------------------------------------------------------
LOCALS
VARIABLE    | TYPE    | VALUE
------------------------------------------------------------------------------------------------------------------------
SCOPE   <code object main2 at 0x108c309c0, file "long_script.py", line 21>
CALLER  <code object main at 0x108c30ed0, file "long_script.py", line 18>
========================================================================================================================

...

安装

我想将此添加到 pypy,但尚未完成。克隆 git repo 并创建一个从 python 脚本文件夹到signint文件夹的符号链接。

ln -s ./siginfo <PATH_TO_SIGINFO_REPO>/siginfo

用法

在你的 python 脚本中包含siginfo

import siginfo

初始化 SignInfo 类

siginfo.SiginfoBasic()

基本概述

siginfo包含以下类:

  • SiginfoBasic打印有关当前堆栈(和调用者堆栈)的信息。定期执行会自动继续。

  • SigInfoPDB打开PDB调试器。暂停脚本执行,直到退出调试器。

  • SigInfoSingle打印当前作用域的单个变量的值。自动继续定期执行。

开始上课

所有类都允许以下参数:

  • info监听SIGNFO(默认值:True)(仅在 Mac 和 BSD 上)

  • usr1监听SIGUSR1(默认值:True

  • usr2监听SIGUSR2(默认值:False

  • output将输出写入的位置(默认值:sys.stdout)。可以是任何提供写入功能的东西。

from siginfo import SiginfoBasic
SiginfoBasic(info=True, usr1=False)  # listen only for SIGINFO
SiginfoBasic(info=False, usr=True)  # listen only for SIGUSR1
SiginfoBasic(output=open('mylog.log', 'a'))  # Write call stack output to a log file

signinfo类实例属性

  • COLUMNS:终端的最大宽度(或输出文件中每行的最大行数)(默认值:当前 tty 列 - 20;如果无法确定,则回退到 80)

  • MAX_LEVELS:要打印的堆栈帧数(默认值:1 [仅当前一个])

  • OUTPUT:与构造函数的输出参数相同。定义将输出写入的位置(默认值:sys.stdout

from siginfo import SiginfoBasic
info_handler = SiginfoBasic()

info_handler.COLUMNS = 200  # Format output to match 200 columns
info_handler.MAX_LEVELS = 4  # Print the current frame + 3 parent frames
info_handler.OUTPUT = open('mylog.log', 'a')  # write the output to mylog.log

API 文档

如需更详细的 API 描述,请查看完整文档

脚注

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

siginfo-0.9.tar.gz (8.4 kB 查看哈希)

已上传 source

内置发行版

siginfo-0.9-py3-none-any.whl (10.9 kB 查看哈希

已上传 py3

siginfo-0.9-py2-none-any.whl (10.9 kB 查看哈希

已上传 py2