我正在构建一个教育工具来分析Python代码,目前,我需要一种在代码执行期间访问变量值的方法。
我知道我可以使用Python模块trace
,并且从python -m trace example.py
获得的输出是理想的数据,可以用来完成所需的操作,但是我无法使其以编程方式运行,并从脚本通过命令行运行它是我的最后资源。
在another question中,作者希望做与我几乎相同的事情,并且,加上this question通过使用sys.settrace
使我朝着正确的方向前进。
在下面的代码示例中,我能够以自己想要的方式跟踪代码执行。
import StringIO
import sys
# to programmatically provide stdin values to the script
sys.stdin = StringIO.StringIO("3")
# to output current variable values
def dump_frame(frame, event, arg):
print '%d: %s' % (frame.f_lineno, event)
for k, v in frame.f_locals.iteritems():
print ' %s = %r' % (k, v)
return dump_frame
# external script should be executed here, instead
# of this static program
def main():
j = int(raw_input())
while j < 10:
j += 1
print j
sys.settrace(dump_frame)
main()
但是我需要动态加载main()
中的代码,我该怎么做?我尝试执行以下所示的操作,其中“ mycode”来自“ ./mycode.py”,其中包含以上代码中main()
中的脚本。但是然后,跟踪输出太长了,也许是因为__import__
函数的内部工作也被跟踪了吗?
# ...
def main():
__import__('mycode')
# ...
那么,如何动态加载代码并对其进行跟踪以获取变量值?