调试:获取调用函数的文件名和行号?

2024-04-30

我目前正在用 Python 构建一个相当复杂的系统,当我调试时,我经常在几个脚本中放入简单的打印语句。为了保持概览,我经常还想打印出打印语句所在的文件名和行号。我当然可以手动执行此操作,或者使用类似这样的操作:

from inspect import currentframe, getframeinfo

print getframeinfo(currentframe()).filename + ':' + str(getframeinfo(currentframe()).lineno) + ' - ', 'what I actually want to print out here'

其打印内容如下:

filenameX.py:273 - what I actually want to print out here

为了使其更简单,我希望能够执行以下操作:

print debuginfo(), 'what I actually want to print out here'

所以我将它放入某个函数中并尝试执行以下操作:

from debugutil import debuginfo
print debuginfo(), 'what I actually want to print out here'
print debuginfo(), 'and something else here'

不幸的是,我得到:

debugutil.py:3 - what I actually want to print out here
debugutil.py:3 - and something else here

它打印出我定义函数的文件名和行号,而不是我调用的行debuginfo()。这是显而易见的,因为代码位于debugutil.py file.

所以我的问题实际上是:如何获取调用此 debuginfo() 函数的文件名和行号?


功能inspect.stack() https://docs.python.org/2/library/inspect.html#inspect.stack返回一个列表帧记录 https://docs.python.org/2/library/inspect.html#the-interpreter-stack,从呼叫者开始并移出,您可以使用它来获取您想要的信息:

from inspect import getframeinfo, stack

def debuginfo(message):
    caller = getframeinfo(stack()[1][0])
    print("%s:%d - %s" % (caller.filename, caller.lineno, message)) # python3 syntax print

def grr(arg):
    debuginfo(arg)      # <-- stack()[1][0] for this line

grr("aargh")            # <-- stack()[2][0] for this line

Output:

example.py:8 - aargh
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试:获取调用函数的文件名和行号? 的相关文章

随机推荐

  • 如何更改 Oracle 云实例的公钥?

    我不小心删除了我的公钥和私钥 并且由于无法恢复密钥 并且在任何地方都没有备份 而不得不生成新的 SSH 密钥 如何更改 Oracle Cloud 实例的公共 SSH 密钥 终止实例并重新创建它不是一个选择 我尝试在网上查找但找不到太多内容
  • 何时处置 CancellationTokenSource?

    班上CancellationTokenSource是一次性的 快速查看 Reflector 证明了KernelEvent 很可能 非托管资源 自从CancellationTokenSource没有终结器 如果我们不处理它 GC就不会这样做
  • 以编程方式创建标签[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是一名 iPhone 开发新手 我想以编程方式创建一个 UILabel 并且我想了解 UILabel 类的所有属性和功能 UILab
  • Cocoapods 彻底崩溃

    首先 我正在使用 Cocoapods 0 37 2 XCode 6 3 1 为 iOS 8 3 进行编译 在我运行基本的 pod update 之前 我的项目运行得很好 现在它完全拒绝编译 我非常肯定这与豆荚本身无关 具体来说 我收到的错误
  • Spring - 属性“name”不允许出现在元素“constructor-arg”中

    我在程序中使用 hsqldb 作为数据库 我想通过 spring 注入构造函数值 这是我的豆子
  • Symfony 从控制器设置块内容

    有没有办法在 Symfony 的控制器中设置模板块内容 有没有办法在控制器中执行类似的操作 this gt get templating gt setBlockContent page title page title 我需要动态设置页面标
  • Python:文本覆盖在所有窗口顶部,包括 Linux 中的全屏

    我正在尝试用 python 编写一个简单的脚本 在所有窗口和全屏应用程序之上输出文本 该脚本的目的是以类似于 Steam FPS 计数器工作方式的方式输出平均负载和可用内存 以及其他有用的统计数据 到目前为止 我尝试了 pygame 但据我
  • GCM 卷曲操作超时

    我的服务器上存储了几个负责 GCM 操作的 php 文件 它们似乎在需要时工作得很好 但它们经常返回一个错误 指出 卷曲错误 操作在 0 毫秒后超时 0 中的 0 收到的字节数 这是服务器的问题还是我的 GCM 代码的问题 下面是我的 ph
  • “params”和“数组参数”有什么区别以及什么时候应该使用它?

    这两种方法的具体区别是什么 何时使用 params 以及何时使用数组参数 如果能得到答复 我们将不胜感激 passing array to a method class Program static void printarray int
  • Xcode 9、iOS 10 的资产问题

    我在使用 iOS 10 的设备上运行资产和 Xcode 9 beta 时遇到问题 它不会从资产上传任何图像 因此在手机上我看不到任何资产 如果我在故事板中加载图像 它不会在手机上显示任何图像 但它会显示在故事板中 如果我执行以下操作 UII
  • 了解 hibernate @Type 注解

    来自休眠官方文档 http docs jboss org ejb3 app server HibernateAnnotations reference en html single d0e2018 org hibernate annotat
  • 如何将资源添加到现有签名程序集

    鉴于 程序集 例如 SomeLib dll 文本文件 例如 myconfig xml 我需要将文件 myconfig xml 嵌入到现有程序集 SomeLib dll 中 在按 回答 之前请考虑 我知道编译过程中的资源嵌入 csc exe
  • 如何使用php测试服务器是否支持文件上传

    这是我测试 MySQL 的代码 if extension loaded mysqlnd echo mysql supported else echo mysql not supported 如何检查是否允许上传 if ini get fil
  • Flutter iOS 构建错误 - 找不到框架 image_picker

    我已经添加了 v0 8 5 的图像选择器 https pub dev packages image picker我的项目中的库 我已尝试以下方法来解决该问题 Deleted podfile lock Pods folder from iOS
  • 将 FB 开放图操作、对象和聚合从开发应用程序迁移到生产应用程序

    一直在破解 facebook open graph 以将项目发布到用户流 目前我已经使用测试应用程序创建了所有操作 对象 聚合 然而我会希望 a 将其迁移到我们的临时服务器进行测试 b 一旦 a 完成 将其迁移到生产服务器 鉴于每个 FB
  • ngx-leaflet/Angular 2 中具有下拉选择输入的属性绑定映射单击事件

    我有一张带有区域多边形的地图 在地图下方 我有一个下拉选择输入 可以动态读取多边形名称作为选项 当用户单击地图上的区域多边形时 我希望下拉选择输入使用选定的多边形名称 作为 geojson 文件中的 名称 字段存在 进行更新 我认为实现此目
  • Scala 和 Spark:如何浏览图像?

    我有一些图像的二进制文件 我想遍历它们 分配像素 集群的每个节点必须获取与另一个节点的像素不同的一组像素的 RGB 并将这些 RGB 存储到斯卡拉集合 我在用SparkContext binaryFiles但我不知道如何让 Apache S
  • 文件更改时重新启动 Heroku 本地吗?

    看来以 heroku local web 启动的本地服务器不会监视文件更改并自行重新启动 我怎样才能让它做到这一点 最简单的方法是运行 nodemonheroku local作为可执行文件 即nodemon exec heroku loca
  • Google Drive 正在监视新文件

    我正在考虑使用 Google Drive 推送通知来取代我们当前的拉取流程 我开始玩它 但我有两个主要问题 观察变化 当监视驱动器更改时 我会收到包含新更改 ID 的通知 但是当我尝试使用driveService changes get c
  • 调试:获取调用函数的文件名和行号?

    我目前正在用 Python 构建一个相当复杂的系统 当我调试时 我经常在几个脚本中放入简单的打印语句 为了保持概览 我经常还想打印出打印语句所在的文件名和行号 我当然可以手动执行此操作 或者使用类似这样的操作 from inspect im