在Python中解密大型程序流程

时间:2014-01-03 23:57:38

标签: python program-flow

我正在学习如何设置一个大型(356个文件),复杂的Python程序。除了手动读取和解析代码之外,还有什么好方法可以跟踪程序流程吗?

我认为有两种方法很有用:

  1. 类似于Bash的“set -x”
  2. 显示哪个文件输出每行输出的东西
  3. 是否有任何方法可以执行上述操作,或者您认为有用的任何其他方法?

4 个答案:

答案 0 :(得分:1)

我不知道这是不是一个好主意,但是因为我实际上写了一个钩子来在每行输出到stdout之前显示文件和行,所以我不妨把它给你...

import inspect, sys

class WrapStdout(object):
    _stdout = sys.stdout
    def write(self, buf):
        frame = sys._getframe(1)
        try:
            f = inspect.getsourcefile(frame)
        except TypeError:
            f = 'unknown'
        l = frame.f_lineno
        self._stdout.write('{}:{}:{}'.format(f, l, buf))
    def flush(self):
        self._stdout.flush()

sys.stdout = WrapStdout()

只需将其保存为模块,并在import之后,每个stdout块都将以文件和行号为前缀。

当然,如果:

,这将变得非常丑陋
  • 任何人都尝试打印部分行(直接使用stdout.write,或使用2.x中的print魔术逗号或3.x中的end=''
  • 您在2.x中混合使用Unicode和非Unicode。
  • 任何源文件都有很长的路径名。

但是所有棘手的深度Python魔术都在那里;你可以很容易地在它之上构建。

答案 1 :(得分:1)

可能非常繁琐,但是使用调试器来跟踪执行流程,逐条指令可能会在某种程度上帮助你。

import pdb
pdb.set_trace()

答案 2 :(得分:0)

您可以寻找交叉参考计划。有一个名为pyxr的旧程序可以做到这一点。交叉引用的目的是让您了解类如何相互引用。一些IDE也做了这样的事情。

答案 3 :(得分:0)

我建议在pydevpycharm等IDE中运行该程序。能够停止程序并检查其状态可能非常有帮助。