以下是我在python中对“模拟操作系统”进行内省时的尝试。
def tracefunc(frame, event, arg, indent=[0]):
if event == "call" and frame.f_code.co_name in methods:
if frame.f_code.co_name != 'FetchOperand':
print("====================================")
print("CALL FUNCTION: %s()\nARGUMENTS: %s" % (frame.f_code.co_name, frame.f_code.co_varnames))
print('====================================')
return tracefunc
sys.settrace(tracefunc)
它包含在一个看起来像这样的块中:
if __name__ == '__main__':
vm = OS()
while(interrupt not shutdown):
try:
vm.read_interrupt()
vm.execute_program()
# some case statement
最终目标是打印出在我的VM对象中封装的任何方法的执行。我想知道它的调用位置,调用者,传入的参数是什么,以及它本身修改了什么变量。我还需要一种方法来指定这些名为output parameters
的东西,这将是一个列表。理想情况下,如果它修改了一个数组,它将打印索引和项目以及该索引。这是一个例子
$my_program: 4
==============================
SYSTEM CALL() method called
called by READ INTERRUPT()
--> Arguments:
arg[0]: 4 <type 'int'>
--> Output Parameters:
gpr[0]: OK
return value: 'OK'
==============================
PUT CHARACTER() method called
called by SYSTEM CALL()
--> Arguments:
None
--> output parameters:
gpr[0]: OK
gpr[1]: 3
--> modified variables:
memory:
index: 4003
old value: 0
new value: 3
return value: 'OK'
==============================
顺便说一下,不要觉得我原来的做事方式太束缚了。我欢迎你提出任何建议。
有人能建议一种实现这种内省的方法吗?
答案 0 :(得分:0)
import traceback
traceback.print_stack()
那应该告诉你所有伟大的事情......