2012-12-03 87 views
-2

我有一个在python中的开源项目的源代码,该项目有一个模块(python)和gui使用模块gui是在qtpython中编写的,现在使用gui并预先形成其中的各种动作是否有任何方式,我可以知道什么是被调用的函数和从哪里像日志和有什么办法,我可以生成源代码的uml图,以便我可以更好地理解它,并贡献到该项目。该项目正在使用的蟒蛇版本是2.7使用开源项目的源代码来学习

+0

@RamNarasimhan:这两个问题都是关于如何找到源代码的。他已经有了源头。他希望在运行时追踪或记录函数调用,或者生成源的UML图。 – abarnert

+0

这是两个不同的问题。从Python生成UML是许多问题的重复,例如,http://stackoverflow.com/questions/260165/whats-the-best-way-to-generate-a-uml-diagram-from-python-source-code 。我建议从你的问题中删除它,然后询问有关日志记录/跟踪程序流程。 – abarnert

回答

1

正如在评论中提到的,从Python生成UML已在this answer中讨论。 (请记住,Python实际上并不一定是UML可表示的 - 但是如果它真的很好)。

至于在运行时看到控制流,有几种方法可以做到这一点。一种是使用分析和/或调试工具。但让我们看看最简单的方法来记录它,这是你要求的:

你可以在任何时间通过print“登录”任何东西到控制台。你必须从命令行运行应用程序,而不是启动它的GUI风格(并且在Mac上,这意味着你必须直接运行可执行文件/脚本,而不是任何已经构建出来的.app包),但是你有日志输出 - 你可以使用你的shell(甚至是Windows cmd)将它重定向到一个文件以供以后浏览,如果你愿意的话。如果这对您不够好,请参阅内置于标准库中的logging模块。

如果你想知道从哪里调用函数,你可以在每次函数被调用时记录堆栈跟踪。这有点难看,但它提供了您想要的所有信息,并且您随时可以编写一些代码来解析输出。功能traceback.print_stack正是如此。 (如果想要更多的功能,可以使用其他功能来提取信息,如果需要的话可以格式化,然后以您想要的方式记录。)

您可以通过将此行添加到要跟踪的每个函数:

traceback.print_stack() 

另一种方式做,这是写一个猴补丁并将其应用到所有你关心的功能:现在

def tracify(func): 
    @functools.wraps(func) 
    def wrapper(*args, **kwargs): 
     traceback.print_stack() 
     func(*args, **kwargs) 
    return wrapper 

,在主脚本,只是这样做:

InterestingClass.interestingMethod = tracify(InterestingClass.interestingMethod) 

现在,每次InterestingClass.interestingMethod被调用时,它都会打印出堆栈跟踪。您不必了解tracify的工作原理。如果你想改变它对功能的作用,只需将traceback.print_stack()替换成你想做的任何事情。

那么,如果你想补充班级中的每个“公共”方法呢?

for attr in dir(InterestingClass): 
    if not attr.startswith('_'): 
     method = getattr(InterestingClass, attr) 
     if isinstance(method, instancemethod): 
      setattr(InterestingClass, tracify(method)) 

(这是为Python 2 Python 3的改变事物的上涨,使得复杂的情况下更简单,但简单的情形不是很平凡。)

如果要修补的每一个每一个公共方法类,和每个免费的功能,在一个模块?你可以用同样的方法迭代一个模块,并检查每个事物的类型,就像你可以用一个类一样。

您也可以使用inspect模块来为您做很难的事情。但是,如果你只是学习Python,我认为复制和粘贴dir代码比学习如何使用inspect简单得多。一旦你对这门语言更加熟悉,回来和inspect一起玩,找出为什么这一切都奏效。

0

我不使用Python,但是当您想要实时跟踪程序在做什么时,您使用调试器,并且为Python调试器做一些搜索操作可能会给您带来一些有希望的结果。