2

好的,这可能是一个困难的问题。而且我不希望你为我做所有的辛苦工作。我只是想得到一些好的建议和我应该开始的地方。

我正在编写几个 python 程序,但调试这些程序时遇到了麻烦。所以我想创建一个简单的调试函数来记录一些事情。

这就是我使用它的方式:

# Defined in random_function_definitios.py
def some_random_function():
  a = 1 + 1
  debug(a)
  # More stuff

我想在调试中显示此信息:

  • 调用它的函数:some_random_function
  • 定义该函数的文件名:random_function_definitios.py
  • 行号:4
  • 一些上下文:定义的全局变量和定义的局部变量。

我一直在看检查模块和框架内置对象。但我不完全确定我是否在正确的方向。

谢谢!

4

2 回答 2

2

您可以使用 Python 的标准日志记录工具。大量数据带有日志记录 - 文档中提供了它们的完整列表:http: //docs.python.org/library/logging.html#logrecord-attributes。您需要的是funcName, filename, lineno。要记录局部变量的转储,您可以转换为内置函数的字符串输出locals()并将其用作日志消息。您需要做的就是使用一个像这样的记录器:

import logging

logger = logging.getLogger('some_module')

def some_random_function():
    a = 1 + 1
    logger.debug(str(locals()))

并使用前面提到的格式属性将其配置为正确的格式。所有这些都在基本日志记录教程中有详细记录:http: //docs.python.org/howto/logging.html#logging-basic-tutorial

编辑

但如果我是你,我会在调试的上下文中启动 python 调试器,以交互方式检查你想要检查的所有内容:

def some_random_function():
    a = 1 + 1
    import pdb; pdb.set_trace()
于 2012-06-18T19:23:03.113 回答
2

我用信息/警告和调试消息编写了自己的 debugger.py。

见:https ://github.com/unixunion/toolbox/blob/master/python/debugger.py

我还使用回溯来遍历堆栈,例如:

except Exception, e:
    # capture the traceback data
    exc_type, exc_value, exc_traceback = sys.exc_info()
    warningMsg("-14 %s" % str(e))
    warningMsg("Exec Traceback")
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
    warningMsg("Exception")
    traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout)
    raise

给出如下结果:

WARNING fabfile.py:76 glassfish_deploy()-14 cannot concatenate 'str' and 'float' objects
WARNING fabfile.py:77 glassfish_deploy()Exec Traceback
File "/home/marzubus/go-agent-scripts/fabfile.py", line 52, in glassfish_deploy    oiled =     gfOil(**kwargs)
WARNING fabfile.py:79 glassfish_deploy()Exception
Traceback (most recent call last):  File "/home/marzubus/go-agent-scripts/fabfile.py",    line 52, in glassfish_deploy
oiled = gfOil(**kwargs)
File "/home/marzubus/go-agent-scripts/oilon/gfdeployer.py", line 37, in __init__
self.tmpDirectory = '/tmp/' + self.domainName + self.time
TypeError: cannot concatenate 'str' and 'float' objects

基根

于 2012-06-18T19:26:32.827 回答