zoukankan      html  css  js  c++  java
  • Python在项目外更改项目内引用

    前言

    目前有一个奇葩的需求, 将某个开源项目整合进自己的项目里去调度, 还需要在每次启动这个开源项目时, 加载不同的配置文件进去, 问题是配置文件并不是一个 conf 或者是其他的什么, 而是以 .py 文件中的变量形式存在, 使用时直接导入的方式去使用, 如图

    目录结构

    api.py

    引用方式

    考虑到后期开源项目迭代也需要同步到这里, 而且希望以多线程的方式可同时运行多个该开源项目, 所以更改 .py 不现实

    正文

    大佬想到了两个方法去做,这里介绍一种

    复写 getattr 方法

    我们知道, getattr 是一个魔法方法, 在 a.b 时实际上就是找到 a 的 getattr 方法

    那我们复写 getattr 方法来完成调用逻辑, 比如动态生成一个字典与该项目绑定, 蛋当调用时我们根据要调用的 key 来返回 value 即可, 但是该项目的引用是 引用其内部的 py 文件配置, 我们只能通过某些方法来将引用覆盖掉, 变成引用到自己设置的 py 文件中

    此时我们使用 sys.modules 功能来做, sys.modules 是一个字典, 他在python启动时启动, 我们每导入一个包, 就会在里面留下一条记录, 实际上使用时就在里面去查找获取模块, 其中的自己写的模块是相对路径

    于是我们在启动开源项目之前把里面的导入配置模块部分找到, 在外面直接赋值给我们自写的指定文件 即可

    在前言里有说, 我们启动开源项目的方式是启动单独的线程去跑, 所以多个线程是多个 配置文件, 此时我们在总调度的这里, 使用 uuid 为每个线程生成一个唯一 id, 在总调度里维护一个字典, key为这个唯一id, value为这个线程分配的keys, 调用getattr时先查询到对应的keys再查找对应的key 即可

    复写的 getattr 方法(_key.py)

    api = {}
    
    def init_api(uid, keys):  # 初始化字典
        value = api.setdefault(uid, {})  # 添加uid对应的keys
        for k, v in keys.items():
            value[k] = v 
    
    def __getattr__(name):
        uid = current_thread().uid  # 获取uuid
        return api.get(uid).get(name, '')  # 从dict中获取值
    

    在开源项目启动之前替换引用

    sys.modules['plug.OneForAll.config.api'] = __import__('_key')  # _key是根目录的 _key.py 文件
    

    在启动线程运行开源项目时赋值 uuid

    thread = threading.Thread(target=self.process_func,
                                        #   name=func_name,
                                          name=self.taskId,
                                          args=(func_obj, self.domain),
                                          daemon=True)
                thread.mod = func_name
                thread.uid = uid
    

    import HOOK 功能

    这是另一种方式, 通过钩子达到在 import 时执行指定逻辑的方式, 因时间关系这里不多说, 有兴趣的可以自己了解

  • 相关阅读:
    TCP连接异常断开检测(转)
    正排索引与倒排索引(转)
    Elasticsearch之优化
    把网卡中断绑定到CPU,最大化网卡的吞吐量(转)
    十张GIFs让你弄懂递归等概念
    二维数组回形遍历(转)
    如何做Go的性能优化?(转)
    Go的50度灰:Golang新开发者要注意的陷阱和常见错误(转)
    Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布(转)
    从零到卓越:京东客服即时通讯系统的技术架构演进历程(转)
  • 原文地址:https://www.cnblogs.com/chnmig/p/12887154.html
Copyright © 2011-2022 走看看