gpt4 book ai didi

python - 您如何找到打印语句所在的位置?

转载 作者:太空狗 更新时间:2023-10-30 01:59:35 29 4
gpt4 key购买 nike

我有一个程序依赖于一个大型代码库,它会打印出很多不相关且烦人的消息。我想稍微清理一下它们,但由于它们的内容是动态生成的,我不能只为它们进行 grep。

有没有办法在打印语句上放置一个钩子(Hook)? (我使用 python 2.4,但我会对任何版本的结果感兴趣)。是否有另一种方法可以找到输出来自哪个“print”语句?

最佳答案

对于 CPython2.5 或更早版本:

import sys
import inspect
import collections
_stdout = sys.stdout

Record = collections.namedtuple(
'Record',
'frame filename line_number function_name lines index')

class MyStream(object):
def __init__(self, target):
self.target = target
def write(self, text):
if text.strip():
record = Record(*inspect.getouterframes(inspect.currentframe())[1])
self.target.write(
'{f} {n}: '.format(f = record.filename, n = record.line_number))
self.target.write(text)

sys.stdout = MyStream(sys.stdout)

def foo():
print('Hi')

foo()

产量

/home/unutbu/pybin/test.py 20: Hi

对于CPython2.6+我们可以导入打印函数

from __future__ import print_function

然后按照我们的意愿重定向它:

from __future__ import print_function
import sys
import inspect
import collections

Record = collections.namedtuple(
'Record',
'frame filename line_number function_name lines index')

def myprint(text):
if text.strip():
record = Record(*inspect.getouterframes(inspect.currentframe())[1])
sys.stdout.write('{f} {n}: '.format(f = record.filename, n = record.line_number))
sys.stdout.write(text + '\n')

def foo():
print('Hi')

print = myprint
foo()

请注意,inspect.currentframe 使用 sys._getframe,它不是所有 Python 实现的一部分。所以上面的解决方案可能只适用于 CPython。

关于python - 您如何找到打印语句所在的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13515048/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com