debugging 分析从另一个Python程序执行的Python程序

wz8daaqr  于 2023-08-06  发布在  Python
关注(0)|答案(1)|浏览(91)

我想写一个Python程序来分析其他任意Python程序的执行。
例如,假设我有一个名为main.py的Python脚本,它调用函数func一定次数。我想创建另一个名为analyzer.py的脚本,它可以在main.py运行时“查看”它,并记录func被调用的次数。我还想记录传递给func的输入参数列表,以及每次调用func时的返回值。
我不能以任何方式修改main.pyfunc的源代码。理想情况下,analyzer.py适用于任何Python程序,任何函数。
我发现的实现这一点的最好方法是让analyzer.py作为使用pdb的子进程运行main.py

script = "main.py"
process = subprocess.Popen(['python', '-m', 'pdb', script], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

字符串
然后我可以通过进程的stdin向程序发送pdb命令,然后通过stdout读取输出。
要检索func的输入参数和返回值,我需要
1.通过分析func的文件找到第一行的行号
1.为此文件发送断点命令/lineno
1.发送继续命令
1.导入pickle,序列化locals(),并打印到stdout(以获取输入参数)
1.发送返回命令(转到函数结束)
1.序列化__return__并打印到标准输出
1.发送继续命令
我想知道是否有更好的方法来完成这一点

zpf6vheq

zpf6vheq1#

在执行import main之前,您可以使用sys.settrace配置自己的跟踪函数,而不是使用管道来控制pdb。(当然,你也可以做importlib.import_module("main")runpy.run_module()runpy.run_path()
比如说

import sys

def trace(frame, event, args):
    if event == "call":
        print(frame.f_code.co_name, frame.f_locals)

sys.settrace(trace)

# (this is where you'd `import main` to cede control to it)

def func(a, b, c):
    return a + b + c

func(1, 2, 3)
func("a", "b", "c")

字符串
打印出来

func {'a': 1, 'b': 2, 'c': 3}
func {'a': 'a', 'b': 'b', 'c': 'c'}

相关问题