如何通过名称加载 python 模块的抽象语法树?

How to load abstract syntax tree of a python module by its name?

假设模块名称以字符串形式提供,而不是模块对象。如何找到它的源代码位置并加载抽象语法树(如果存在源代码)?

我会分三步解决这个问题:

  1. 按名称导入模块。使用 importlib.import_module 应该相对容易,但如果需要,您可以使用内置 __import__ 来构建自己的版本。
  2. 获取模块的源代码。使用 inspect.getsource 可能是最简单的方法(但您也可以尝试 open(the_module.__file__).read() 并且它可能会起作用)。
  3. 将源代码解析为 AST。 ast.parse 这应该很容易。即使对于这一步,库也不是必需的,因为您可以使用内置 compile 代替,只要您传递适当的标志(ast.PyCF_ONLY_AST 在我的系统上似乎是 1024 ,所以 compile(source, filename, 'exec', 1024) 应该有效)。