标识当前正在执行的函数调用

2024-10-02 18:16:15 发布

您现在位置:Python中文网/ 问答频道 /正文

在同一线路上对同一函数进行多次调用时。故障排除时,是否可以使用回溯或sys库来识别当前正在执行的程序?你知道吗

编辑:请不要提供变通方法。我知道我需要知道的关于如何解决这个问题的所有知识。我想知道的是,是否有一种方法可以找到有关解析/执行状态的更精确的信息,而不仅仅是调用指令的行号。

举个例子:

#!/usr/bin/python3
# coding: UTF-8


def fn(var):
    import traceback
    print(repr(traceback.extract_stack()[-2]))
    return var+1

a = b = 4
print(fn(a)+fn(b))

在空闲状态下运行此命令将写入:

 RESTART: /.../python/framesummary.py 
<FrameSummary file /.../python/framesummary.py, line 11 in <module>>
<FrameSummary file /.../python/framesummary.py, line 11 in <module>>
10

有没有办法知道fn函数内部当前是在执行fn(a)还是fn(b)?你知道吗


编辑2:

我添加了一个案例,表明不能使用调用命令

#!/usr/bin/python3
# coding: UTF-8

def fn(var):
    import traceback
    stack = traceback.extract_stack()
    print(repr(stack[-2]))
    print("code = '"+stack[-2][-1]+"'")

    import sys
    calling_frame = sys._getframe(1)
    print("lasti =", calling_frame.f_lasti)
    print()

    return var+1

a = b = 4
print("case = sum", fn(a)+fn(b), "\n")
for boole in False, True:
    print("case =", boole, fn(a) if boole else fn(b), "\n")

将打印:

 RESTART: /.../python/framesummary cleaned.py 
<FrameSummary file /.../python/framesummary cleaned.py, line 18 in <module>>
code = 'print("case = sum", fn(a)+fn(b), "\n")'
lasti = 34

<FrameSummary file /.../python/framesummary cleaned.py, line 18 in <module>>
code = 'print("case = sum", fn(a)+fn(b), "\n")'
lasti = 43

case = sum 10 

<FrameSummary file /.../python/framesummary cleaned.py, line 20 in <module>>
code = 'print("case =", boole, fn(a) if boole else fn(b), "\n")'
lasti = 100

case = False 5 

<FrameSummary file /.../python/framesummary cleaned.py, line 20 in <module>>
code = 'print("case =", boole, fn(a) if boole else fn(b), "\n")'
lasti = 88

case = True 5 

最好是有一个调用的第一个字符的指示,或者一种重新编译代码的方法,以便获得与每个调用对应的lasti值。你知道吗

显然,分析结果表明lasti的值与位置相关,但到目前为止,我在执行程序之前还没有发现这种关系:

lasti =  34 => (line, column) = (18, 33) (or pos=29 in unindented string⁽¹⁾)
lasti =  43 => (line, column) = (18, 39) (or pos=35 in unindented string⁽¹⁾)
lasti =  88 => (line, column) = (20, 40) (or pos=32 in unindented string⁽¹⁾)
lasti = 100 => (line, column) = (20, 60) (or pos=52 in unindented string⁽¹⁾)

(1)由堆栈[-2][-1]给出


Tags: inpystacklinecodefilefnmodule
2条回答

我认为你最好的办法是学习如何使用pdb。而您可以修改代码,以便对正在运行的代码进行某种有限的内省。让一个正在运行的调试器允许您在代码被评估时观察代码的状态将更容易,而且最终也更有价值。你知道吗

试试pdb

def fn(var):
    import pdb; pdb.set_trace()
    return var+1

a = b = 4
print(fn(a)+fn(b)

这将打开python调试器,并允许您使用w这表示在pdb中打印堆栈跟踪的位置。或者l,显示当前执行行的源代码,等等

它看起来像这样

owen@lettuce:~ python temp.py
> /home/owen/temp.py(3)fn()
-> return var+1
(Pdb) w
  /home/owen/temp.py(6)<module>()
-> print(fn(a)+fn(b))
> /home/owen/temp.py(3)fn()
-> return var+1
(Pdb) l
  1     def fn(var):
  2         import pdb; pdb.set_trace()
  3  ->     return var+1
  4
  5     a = b = 4
  6     print(fn(a)+fn(b))
[EOF]
(Pdb)

祝你好运。希望这有帮助。你知道吗

您可以发送一个唯一且随机的ID作为额外参数,并将其添加到日志中。你知道吗

标识符将帮助您追溯到原点。你知道吗

a = b = 4
id1 = some random no.
id2 = some random no.
print(fn(a, id1)+fn(b, id2))

相关问题 更多 >