当前位置: 首页 > 面试题库 >

我如何打印被调用的函数

程景胜
2023-03-14
问题内容

在调试Python脚本时,我真的很想知道整个程序的整个调用堆栈。理想的情况是,如果有一个用于python的命令行标志,它将导致Python在调用它们时打印所有函数名(我检查了man Python2.7,但是没有找到这种类型的东西)。

由于此脚本中函数的数量众多,因此,我尽量不要在每个函数和/或类的开头添加打印语句。

一个中间的解决方案是使用PyDev的调试器,放置几个断点并检查程序中给定点的调用堆栈,因此我暂时将使用这种方法。

如果存在这样的方法,我仍然希望查看程序整个生命周期内调用的所有函数的完整列表。


问题答案:

您可以使用跟踪函数来执行此操作(Spacedman的道具可以改进此函数的原始版本以跟踪返回并使用一些不错的缩进):

def tracefunc(frame, event, arg, indent=[0]):
      if event == "call":
          indent[0] += 2
          print("-" * indent[0] + "> call function", frame.f_code.co_name)
      elif event == "return":
          print("<" + "-" * indent[0], "exit function", frame.f_code.co_name)
          indent[0] -= 2
      return tracefunc

import sys
sys.setprofile(tracefunc)

main()   # or whatever kicks off your script

请注意,函数的代码对象通常与关联的函数具有相同的名称,但并非总是如此,因为可以动态创建函数。不幸的是,Python没有跟踪堆栈上的函数对象(我有时幻想着为此提交一个补丁)。不过,在大多数情况下,这当然“足够好”。

如果这成为问题,则可以从源代码中提取“真实的”函数名称(Python会跟踪文件名和行号),或者让垃圾回收器找出哪个函数对象引用了代码对象。可能有一个以上的函数共享代码对象,但是它们的任何名称可能都足够好。

回到四年之后,我应该提到在Python
2.6及更高版本中,使用sys.setprofile()而不是可以获得更好的性能sys.settrace()。可以使用相同的跟踪功能。只是仅当函数进入或退出时才调用profile函数,因此函数内部的内容将全速执行。



 类似资料:
  • 问题内容: 我正在为我的python应用程序使用elasticsearch- dsl 查询elasticsearch。 为了调试elasticsearch-dsl库实际生成的查询,我无法记录或打印最终查询到elasticsearch的查询。 例如,就像看到发送到elasticsearch的请求正文一样: 试图将elasticsearch日志级别提高到TRACE。即使这样,也无法看到已执行的查询。

  • testdate.java:

  • 我正在为我的python应用程序使用elasticsearch ch-dsl来查询弹性搜索。 为了调试elasticsearch dsl库实际生成的查询,我无法记录或打印到elasticsearch的最终查询。 例如,希望看到发送给elasticsearch的请求正文如下: 尝试将elasticsearch日志级别提高到TRACE。即使这样,也无法看到已执行的查询。

  • 本文向大家介绍Java如何调用TSC打印机进行打印详解,包括了Java如何调用TSC打印机进行打印详解的使用技巧和注意事项,需要的朋友参考一下 前言 最近项目中用到了打印机,最开始的完全不懂,现在弄好了,所以做了总结,该篇包括后台的调用打印(两种方式)跟前端的js的打印,但是只有IE现在支持打印,而且如果想远程连接打印机,二维码的生成和直接由打印机的命令进行操作,就要把修改浏览器的安全配置,下面再

  • 问题内容: 我有一个页面应该在加载时启动“打印预览”页面。 我找到了这个: 但… 它在FireFox中不起作用。 这有点丑陋。 IE是否有更好的方法或适用于FireFox的方法? 问题答案: 您不能,“打印预览”是浏览器的功能,因此应避免被JavaScript调用,因为这会带来安全风险。 这就是您的示例使用Active X(绕过JavaScript安全问题)的原因。 因此,请改用您应该已经拥有的打

  • 问题内容: 我刚开始学习Python,目前正在读一本教我的书,在这本书中,一个函数与我在下面编写的函数一样,会打印第一个函数中定义的实际文本。我运行我的脚本说: 作为输出。我究竟做错了什么?我安装了错误的Python或其他东西吗?我下载了3.3.0版本 这是我的代码: 问题答案: 您的函数已经打印了文本,您不需要打印函数。只是称呼他们(别忘了括号)。