• 技术文章 >Python技术 >Python基础教程

    python探针如何实现

    小妮浅浅小妮浅浅2021-09-25 09:33:14原创2727

    1、探针importhook的功能可以通过sys.meta_path来实现。

    2、当执行import相关操作时,import相关库将根据sys.meta_path定义的对象进行更改。

    sys.meta_path中的对象需要实现find_module方法。这种find_module方法返回None或实现load_module方法的对象。我们可以通过这个对象在import中替换一些图书馆的相关方法。简单用法如下。通过hooktime.sleep,可以在sleep中打印时间。

    实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    import importlib

    import sys

    from functools import wraps

      

      

    def func_wrapper(func):

        """这里通过一个装饰器来达到狸猫换太子和获取数据的效果"""

        @wraps(func)

        def wrapper(*args, **kwargs):

            # 记录开始时间

            start = time.time()

            result = func(*args, **kwargs)

            # 统计消耗时间

            end = time.time()

            print(f"speed time:{end - start}")

            return result

        return wrapper

      

      

    class MetaPathFinder:

      

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

            # 执行时可以看出来在import哪些模块

            print(f'find module:{path}:{fullname}')

            return MetaPathLoader()

      

      

    class MetaPathLoader:

      

        def load_module(self, fullname):

            # import的模块都会存放在sys.modules里面, 通过判断可以减少重复import

            if fullname in sys.modules:

                return sys.modules[fullname]

            # 防止递归调用

            finder = sys.meta_path.pop(0)

            # 导入 module

            module = importlib.import_module(fullname)

            if fullname == 'time':

                # 替换函数

                module.sleep = func_wrapper(module.sleep)

            sys.meta_path.insert(0, finder)

            return module

      

      

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

      

      

    if __name__ == '__main__':

        import time

        time.sleep(1)

      

      

    # 输出示例:

    # find module:datetime

    # find module:time

    # load module:time

    # find module:math

    # find module:_datetime

    # speed time:1.00073385238647468

    以上就是python探针的实现,希望对大家有所帮助。更多Python学习指路:python基础教程

    本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。

    专题推荐:python探针
    上一篇:python有序Dict的原理 下一篇:python如何制作探针模块

    相关文章推荐

    • Python Modules是什么意思• python三种导入模块的方式• python查找计算函数的整理• python填充压缩的函数总结• python分割拼接函数的介绍• python判断字符串函数的归纳• python如何实现图像等比缩放• python setup和teardown的使用• python绘制散点图的两种方法• python用plt.pie绘制饼图• python Axes3D绘制3D图形• python raise触发异常的实现• python链表法的优缺点• python有序Dict的原理

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网