You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python日志打印问题:输出库文件行号而非调用方文件行号

问题:日志函数无法打印调用方的文件名和行号

当前基于inspect模块实现的日志函数,调用时输出的是库文件自身的文件名及行号,而非调用该函数的业务代码文件的对应信息。

代码示例

库文件 lib.py

#!/bin/env python3
# library source code (lib.py)
from inspect import currentframe, getframeinfo


def get_file_name():
        return __file__


def get_line():
        frameinfo = getframeinfo(currentframe())
        return f"[{frameinfo.filename}:{frameinfo.lineno}]"

def log(data):
        print(f"{get_line()} {data}")

调用文件 program.py

# program source code (program.py)
#!/bin/env python3


import lib


lib.log("hi")

实际输出

[/home/shubhapp/python3/codathon/doubt/lib.py:9] hi

期望输出

[/home/shubhapp/python3/codathon/doubt/program.py:7] hi

解决方案

问题出在get_line函数中:currentframe()获取的是当前get_line函数所在的栈帧,我们需要获取调用log函数的上层栈帧(即调用者的栈帧)。通过currentframe().f_back可以拿到上一层栈帧,再传入getframeinfo即可。

修改后的lib.py代码:

#!/bin/env python3
# library source code (lib.py)
from inspect import currentframe, getframeinfo


def get_file_name():
        return __file__


def get_line():
        # 获取调用者的栈帧(跳过当前get_line函数的栈帧)
        caller_frame = currentframe().f_back
        frameinfo = getframeinfo(caller_frame)
        return f"[{frameinfo.filename}:{frameinfo.lineno}]"

def log(data):
        print(f"{get_line()} {data}")

再次运行program.py,输出将符合期望:

[/home/shubhapp/python3/codathon/doubt/program.py:7] hi

内容的提问来源于stack exchange,提问作者Shubham Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:27:28