1、通过sysss,可以探测importhook的功能.meta_path实现。
2、import相关操作执行时,import相关库将根据syss执行.meta更改path定义的对象。
sys.meta_path中的对象需要实现find_module方法。这种find_module方法返回none或实现load_module方法的对象。我们可以通过这个对象在import中替换一些图书馆的相关方法。简单的用法如下。通过hooktime.sleep,在slep中打印时间。
实例
importimportlib importsys fromfunctoolsimportwraps deffunc_wrapper(func): """这里通过一个装饰来实现狸猫换太子和获取数据的效果""" @wraps(func) defwrapper(*args,**kwargs): #记录开始时间 start=time.time() result=func(*args,**kwargs) #统计消耗时间 end=time.time() print(f"speedtime:{end-start}") returnresult returnwrapper classMetaPathFinder: deffind_module(self,fullname,path=None): #执行时可以看到import中的哪些模块 print(f'findmodule:{path}:{fullname}') returnMetaPathLoader() classMetaPathLoader: defload_module(self,fullname): #将import模块存储在syss中.在modules中,通过判断可以减少import的重复 iffullnameinsys.modules: returnsys.modules[fullname] #防止递归调用 finder=sys.meta_path.pop(0) #导入module module=importlib.import_module(fullname) iffullname=='time': #替换函数 module.sleep=func_wrapper(module.sleep) sys.meta_path.insert(0,finder) returnmodule sys.meta_path.insert(0,MetaPathFinder()) if__name__='__main__': importtime time.sleep(1) #输出示例: #findmodule:datetime #findmodule:time #loadmodule:time #findmodule:math #findmodule:_datetime #speedtime:1.00073385238647468
以上就是python探针的实现,希望对大家有所帮助。更多Python学习指导:基础教程python基础教程
本文教程操作环境:windows7系统Python 3.9.1,DELL G3电脑。