如何通过名称加载 python 模块的抽象语法树?
How to load abstract syntax tree of a python module by its name?
假设模块名称以字符串形式提供,而不是模块对象。如何找到它的源代码位置并加载抽象语法树(如果存在源代码)?
我会分三步解决这个问题:
- 按名称导入模块。使用
importlib.import_module
应该相对容易,但如果需要,您可以使用内置 __import__
来构建自己的版本。
- 获取模块的源代码。使用
inspect.getsource
可能是最简单的方法(但您也可以尝试 open(the_module.__file__).read()
并且它可能会起作用)。
- 将源代码解析为 AST。
ast.parse
这应该很容易。即使对于这一步,库也不是必需的,因为您可以使用内置 compile
代替,只要您传递适当的标志(ast.PyCF_ONLY_AST
在我的系统上似乎是 1024
,所以 compile(source, filename, 'exec', 1024)
应该有效)。
假设模块名称以字符串形式提供,而不是模块对象。如何找到它的源代码位置并加载抽象语法树(如果存在源代码)?
我会分三步解决这个问题:
- 按名称导入模块。使用
importlib.import_module
应该相对容易,但如果需要,您可以使用内置__import__
来构建自己的版本。 - 获取模块的源代码。使用
inspect.getsource
可能是最简单的方法(但您也可以尝试open(the_module.__file__).read()
并且它可能会起作用)。 - 将源代码解析为 AST。
ast.parse
这应该很容易。即使对于这一步,库也不是必需的,因为您可以使用内置compile
代替,只要您传递适当的标志(ast.PyCF_ONLY_AST
在我的系统上似乎是1024
,所以compile(source, filename, 'exec', 1024)
应该有效)。