动态构建python依赖关系图

2024-05-21 03:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

每次导入模块时,我都可以重写通知的__built__.__import__,但这种方法似乎是不明智的,因为PEP 302。在

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


Tags: 模块and工具方法框架modulessnakefoodfinder
1条回答
网友
1楼 · 发布于 2024-05-21 03:34:03

有可能(如果有问题)重新分配给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()

但是,如果导入系统发生更改,则可能需要进行一些维护。在

相关问题 更多 >