Python运行实现的原理

本文探讨Python探针的实现原理,通过sys.meta_path实现import hook,介绍如何利用装饰器替换函数对象以统计特定函数执行时间。文章还讨论了通过sitecustomize.py自动执行import hook并在启动Python解释器时加载探测程序,以及创建类似newrelic-admin的agent.py命令行工具,以简化探针的使用流程。
摘要由CSDN通过智能技术生成

前言

本文主要讲述Python 探针的实现原理,为了验证,我们会来实现一个简单的统计指定函数执行时间的探针程序。

探针的实现主要涉及以下几个知识点:

1、sys.meta_path

2、sitecustomize.py




sys.meta_path 这个简单来说就是可以实现 import hook 的功能。

当执行 import 相关的操作时,会触发 sys.meta_path 列表中定义的对象。

关于 sys.meta_path 更详细的资料请查阅 python 文档中 sys.meta_path 相关内容以及PEP 0302 。

sys.meta_path 中的对象需要实现一个 find_module 方法。

这个 find_module 方法返回 None 或一个实现了 load_module 方法的对象。

import sys

 

class MetaPathFinder:

 

    def find_module(self, fullname, path=None):

        print('find_module {}'.format(fullname))

        return MetaPathLoader()

 

class MetaPathLoader:

 

    def load_module(self, fullname):

        print('load_module {}'.format(fullname))

        sys.modules[fullname] = sys

        return sys

 

sys.meta_path.insert(0, MetaPathFinder())

 

if __name__ == '__main__':

    import http

    print(http)

    print(http.version_info)
    

load_module 方法返回一个 module 对象,这个对象就是 import 的 module 对象了。

比如我上面那样就把 http 替换为 sys 这个 module 了。

$ python meta_path1.py

find_module http

load_module http

 

sys.version_info(major=3, minor=5, micro=1, releaselevel='final', serial=0)

通过 sys.meta_path 我们就可以实现 import hook 的功能:

当 import 预定的 module 时,对这个 module 里的对象来个狸猫换太子。

从而实现获取函数或方法的执行时间等探测信息。

上面说到了狸猫换太子,那么怎么对一个对象进行狸猫换太子的操作呢?

对于函数对象,我们可以使用装饰器的方式来替换函数对象。

import functools

import time

 

def func_wrapper(func):

    @func
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值