我想确定库中每个python模块的导入,以便在自定义配置管理框架中使用.我见过像snakefood这样的工具,但我更喜欢在正常程序执行期间计算依赖图,而不是编译步骤.
到目前为止,我已经尝试编写自定义Finder和Loader.这两种方法在第一次导入模块时按预期工作,但由于sys.modules缓存而不会在后续导入时触发.
我可以__built__.__import__在每次导入模块时覆盖通知,但是从PEP 302开始,这种方法似乎是不明智的.
我可以在sys.modules缓存查找前放置导入钩子吗?或者另一种快速计算依赖关系的方法?
可以(如果 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)
但是,如果导入系统发生变化,这可能需要一些维护。
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |