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
相关产品推荐
相关产品推荐

