2

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

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

  1. 类似于 Bash 的“set -x”
  2. 显示哪个文件输出每一行输出的东西

是否有任何方法可以执行上述操作,或者您发现任何其他有用的方法?

4

4 回答 4

1

我不知道这是否真的是一个好主意,但是由于我实际上写了一个钩子来显示每行输出到stdout之前的文件和行,所以我还不如给你......</p>

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 或3.x中使用print魔法逗号)。end=''
  • 您在 2.x 中混合使用 Unicode 和非 Unicode。
  • 任何源文件都有长路径名。
  • 等等

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

于 2014-01-04T00:09:04.633 回答
1

可能非常乏味,但使用调试器跟踪执行流程,逐条指令可能会在一定程度上帮助您。

import pdb
pdb.set_trace()
于 2014-01-04T00:11:50.293 回答
0

我建议在pydevpycharm 之类的 IDE 中运行程序。能够停止程序并检查其状态会非常有帮助。

于 2014-01-06T18:34:12.063 回答
0

你可以找一个交叉参考程序。有一个名为 pyxr 的旧程序可以做到这一点。交叉引用的目的是让您知道类如何相互引用。一些IDE也做这种事情。

于 2014-01-04T00:08:53.037 回答