我正在构建一个可视Python调试器(http://thonny.org),它依赖于在编译之前检测代码。我在AST中插入了一些标记调用,所以我开始了解例如。哪个表达式即将被执行。
目前我只检测主模块,但我想获得一些导入模块的额外信息。
如何覆盖导入系统的编译部分?我想我需要创建一个新的加载器,但是如何注册呢?
答案 0 :(得分:1)
首先,你确定修改AST是要走的路吗? Python已经提供了跟踪函数调用的方法。例如,请参阅sys.call_tracing
和sys.settrace
。
这些函数意图用于实现调试器。
无论如何,如果你想实现并注册一个新的模块加载器,你必须查看importlib
。 PEP 302中描述了用于注册自定义导入程序的挂钩。
基本上,您只需要实现一个 finder 类,并将其插入sys.path_hooks
或sys.meta_path
,具体取决于您希望它执行的时间。此finder类在提供模块名称时将实现find_loader
方法,该方法将返回给定模块的自定义加载程序。
loader类可以在其load_module
中完成任何操作。您可能希望使用ast
模块来解析模块的内容,在使用主模块时进行修改,然后使用compile
或等效模块来获取代码对象。