我有一个Python应用程序,它有时会卡住,我不知道在哪里.

有没有办法通知Python解释器向您显示正在运行的确切代码?

某种飞翔上的追踪?

Related questions:

推荐答案

我有一个模块,我用来处理这样的情况-进程将运行很长时间,但有时会因为未知和不可重现的原因而停滞不前.它有点老套,只能在Unix上运行(需要信号):

import code, traceback, signal

def debug(sig, frame):
    """Interrupt running process, and provide a python prompt for
    interactive debugging."""
    d={'_frame':frame}         # Allow access to frame object.
    d.update(frame.f_globals)  # Unless shadowed by global
    d.update(frame.f_locals)

    i = code.InteractiveConsole(d)
    message  = "Signal received : entering python shell.\nTraceback:\n"
    message += ''.join(traceback.format_stack(frame))
    i.interact(message)

def listen():
    signal.signal(signal.SIGUSR1, debug)  # Register handler

要使用它,只需在程序启动时调用listen()函数(您甚至可以将其粘贴在site.py中,让所有python程序都使用它),然后让它运行.在任何时候,都可以使用kill或python向进程发送SIGUSR1信号:

    os.kill(pid, signal.SIGUSR1)

这将导致程序在当前的位置断开到python控制台,向您显示堆栈跟踪,并允许您操作变量.使用control-d(EOF)继续运行(不过请注意,您可能会在发送信号时中断任何I/O等,因此它不是完全非侵入性的.

我还有另一个脚本做同样的事情,只是它通过管道与正在运行的进程通信(允许调试后台进程等).在这里发布有点大,但我把它添加为python cookbook recipe.

Python相关问答推荐

Streamlit应用程序中的Plotly条形图中未正确显示Y轴刻度

移动条情节旁边的半小提琴情节在海运

在ubuntu上安装dlib时出错

Pandas Loc Select 到NaN和值列表

名为__main__. py的Python模块在导入时不运行'

如何杀死一个进程,我的Python可执行文件以sudo启动?

Polars Group by描述扩展

将链中的矩阵乘法应用于多组值

使用嵌套对象字段的Qdrant过滤

jsonschema日期格式

如何从比较函数生成ngroup?

如何训练每一个pandaprame行的线性回归并生成斜率

Scipy差分进化:如何传递矩阵作为参数进行优化?

解析CSV文件以将详细信息添加到XML文件

用LAKEF划分实木地板AWS Wrangler

使用_in链接操作管道传输的中间结果是否可用于链中的后续函数?

使代码更快地解决哪个字母代表给定公式中的哪个数字

将标量值作为输入并输出矩阵的函数的积分

Django/Python-UpdateView中的Delete函数正在复制,而不是删除

Pandas:根据系列词典中的值筛选行