如何使用/自定义编译导入的Python模块?

时间:2015-09-13 06:33:56

标签: python python-import instrumentation

我正在构建一个可视Python调试器(http://thonny.org),它依赖于在编译之前检测代码。我在AST中插入了一些标记调用,所以我开始了解例如。哪个表达式即将被执行。

目前我只检测主模块,但我想获得一些导入模块的额外信息。

如何覆盖导入系统的编译部分?我想我需要创建一个新的加载器,但是如何注册呢?

1 个答案:

答案 0 :(得分:1)

首先,你确定修改AST是要走的路吗? Python已经提供了跟踪函数调用的方法。例如,请参阅sys.call_tracingsys.settrace

这些函数意图用于实现调试器。

无论如何,如果你想实现并注册一个新的模块加载器,你必须查看importlibPEP 302中描述了用于注册自定义导入程序的挂钩。

基本上,您只需要实现一个 finder 类,并将其插入sys.path_hookssys.meta_path,具体取决于您希望它执行的时间。此finder类在提供模块名称时将实现find_loader方法,该方法将返回给定模块的自定义加载程序。

loader类可以在其load_module中完成任何操作。您可能希望使用ast模块来解析模块的内容,在使用主模块时进行修改,然后使用compile或等效模块来获取代码对象。