我想写一个Python程序来分析其他任意Python程序的执行。
例如,假设我有一个名为main.py
的Python脚本,它调用函数func
一定次数。我想创建另一个名为analyzer.py
的脚本,它可以在main.py
运行时“查看”它,并记录func
被调用的次数。我还想记录传递给func
的输入参数列表,以及每次调用func
时的返回值。
我不能以任何方式修改main.py
或func
的源代码。理想情况下,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.发送继续命令
我想知道是否有更好的方法来完成这一点
1条答案
按热度按时间zpf6vheq1#
在执行
import main
之前,您可以使用sys.settrace
配置自己的跟踪函数,而不是使用管道来控制pdb。(当然,你也可以做importlib.import_module("main")
或runpy.run_module()
或runpy.run_path()
。比如说
字符串
打印出来
型