动态构建python依赖图

joh*_*mcs 6 python

我想确定库中每个python模块的导入,以便在自定义配置管理框架中使用.我见过像snakefood这样的工具,但我更喜欢在正常程序执行期间计算依赖图,而不是编译步骤.

到目前为止,我已经尝试编写自定义Finder和Loader.这两种方法在第一次导入模块时按预期工作,但由于sys.modules缓存而不会在后续导入时触发.

我可以__built__.__import__在每次导入模块时覆盖通知,但是从PEP 302开始,这种方法似乎是不明智的.

我可以在sys.modules缓存查找前放置导入钩子吗?或者另一种快速计算依赖关系的方法?

int*_*ser 1

可以(如果 hacky)重新分配给sys.modules

import sys
import inspect

old_sys_modules = sys.modules

class NewSysModules():
  def __getitem__(self, mod_name):
    frame = inspect.currentframe().f_back
    while frame.f_globals["__name__"].startswith("importlib"):
      frame = frame.f_back # go back until we're not in a importlib frame
    importer = frame.f_globals["__name__"]
    print(f"importing {mod_name} from {importer}")

    return old_sys_modules[mod_name]

  def __setitem__(self, mod_name, module):
    old_sys_modules[mod_name] = module

sys.modules = NewSysModules()
Run Code Online (Sandbox Code Playgroud)

但是,如果导入系统发生变化,这可能需要一些维护。