我正在学习如何设置一个大型(356 个文件)、复杂的 Python 程序。除了手动阅读和解析代码之外,还有什么好的方法可以跟踪程序流程吗?
我认为有两种有用的方法:
- 类似于 Bash 的“set -x”
- 显示哪个文件输出每一行输出
是否有任何方法可以执行上述操作,或者您发现有用的任何其他方法?
最佳答案
我不知道这实际上是不是一个好主意,但由于我实际上编写了一个钩子(Hook)来在输出到 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()
只需将其保存为模块,然后导入
它后,标准输出的每个 block 都会以文件和行号为前缀。
当然,如果出现以下情况,这会变得非常难看:
- 任何人尝试打印部分行(直接使用
stdout.write
,或在 2.x 中使用print
魔术逗号,或end=''
在 3.x 中)。 - 您在 2.x 中混合了 Unicode 和非 Unicode。
- 任何源文件都具有长路径名。
- 等等
但是所有棘手的深度 Python 魔法位都在那里;您可以非常轻松地在其基础上进行构建。
关于python - 破译Python中的大型程序流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914919/