翼度科技»论坛 编程开发 python 查看内容

aardio教程) 搭建自己的扩展库仓库

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
前言

aardio中有些经常使用的库,换个项目总需要复制一下,还不便于修改。虽然可以直接把它放到aardio\lib目录下,也是不便于共享给其他人使用。
最近偶然翻到编辑器里的工具->开发环境->扩展库发布工具,就想着可以像官方一样,发布自己的扩展库,也便于分享给大家使用,最好能像官方扩展库一样在线安装。
阅读官方代码

翻了一下代码,其实官方扩展库的逻辑也很简单,先请求一遍所有扩展库列表,这是个json文件。
里面包含扩展库的基本信息和下载的url,下载的格式是.tar.lzma,而上面的扩展库发布工具就是将库打包成这个格式。
当你要安装某个库时,就会把它下载并解压到aardio\lib文件夹下。
写好的成品

下面是我弄的扩展库,目前库只有几个,基本都是我最近才写的,有兴趣的可以去github下载测试下bug。

欢迎大家共享一些常用库,减少造轮子的时间。
开源地址

搭建的代码放到github了,你可以简单的修改代码里面的仓库地址来做一个自己的扩展仓库
github:https://github.com/kanadeblisst00/aardio-extlibs
github的访问国内偶尔会抽风,所以我扩展库里的下载地址放的是国内服务器搭建的镜像仓库(它会每10分钟同步上面github的数据)
国内加速仓库: http://git.pygrower.cn/kanadeblisst/aardio-extlibs
使用方法

先下载extlibs.aardio这个文件到本地(只需要这个文件,其他都是打包的代码,这个是下载的代码)
把它重命名为5.extlibs.aardio,移动到aardio\tools文件夹下,该目录下还有个1.ext.aardio文件,这是官方扩展库。
接着重新打开aardio的编辑器,就可以在工具里看到有个非官方扩展库。使用方法和上面的扩展库是一样的,运行它选择需要安装的库,它就会下载好放到aardio\lib目录下

搭建教程

上面的仓库里的代码就是搭建的全部代码。这里我简单的说一下这些代码流程
目录结构


  • dist: 打包后的文件,用于在extlibs.aardio里远程下载安装
  • lib: 库代码
  • res: 库的使用案例
  • main.aardio: 将lib下的库打包压缩到dist里
搭建步骤

将你需要打包的库放在lib目录下,然后打开这个项目并运行。它会将lib下的所有库打包成tar文件放在dist\package目录下。
还会将res目录存放的案例打包成zip放到dist\samples下,同时生成库的json信息。而dist\exlibs.json是所有库的汇总信息。
格式如下:
  1. {
  2.     "goquery":{
  3.         "author":"kanadeblisst",
  4.         "description":"goquery封装库,用于解析HTML",
  5.         "url":"http://git.pygrower.cn/kanadeblisst/aardio-extlibs/raw/branch/master/dist/package/goquery.tar.lzma",
  6.         "version":"1.0.0.1",
  7.         "weight":1
  8.     }
  9. }
复制代码
后面只需把项目代码(extlibs.aardio和main.aardio)里的git地址换成你自己的git地址
thread.set("GithubRepo", "http://git.pygrower.cn/kanadeblisst/aardio-extlibs");
具体流程

运行了项目之后就会在dist目录下生成需要的文件,而这些文件都可以通过链接直接访问到。
比如exlibs.json的链接就是仓库地址+ /raw/branch/master/dist/exlibs.json,这样就能下载到所有的库信息,然后把它显示到界面。
下载的函数只需要在ide.requestLibInfo这个库函数基础上修改下url,代码如下
  1. var requestLibInfo = function(libName){
  2.         return ..thread.invokeAndWait(
  3.                 function(libName){
  4.                         import web.rest.jsonLiteClient;
  5.                        
  6.                         var repoUrl = thread.get("GithubRepo");
  7.                         var url = repoUrl + "/raw/branch/master/dist/exlibs.json";
  8.                         var http = web.rest.jsonLiteClient(null,"");
  9.                         var libApi = http.api(url)
  10.                         var listLib = libApi.get();
  11.                         http.close();
  12.                         var lib;
  13.                         if(libName){
  14.                                 lib = listLib[libName];
  15.                                 lib["libName"] = libName;
  16.                         }else{
  17.                                 lib = listLib;
  18.                         }
  19.                        
  20.                         return lib;
  21.                 },libName
  22.         )
  23. };
复制代码
requestLibInfo

官方使用的ide.requestLibInfo来下载库信息。但url是在函数里写死的,我并不想修改ide这个库的代码,又想让这个函数去我指定的链接下载库信息,怎么操作最方便?
最先想到的肯定是将var libs = ide.requestLibInfo();改成var libs = requestLibInfo();,我不用它就行了。
但有个问题ide.installLib方法也被使用了,而且还调用了ide.requestLibInfo,难道又要重写installLib?
偷懒的修改方式

当然不用,修改的话很简单,只需要多加一行代码:
  1. import ide;
  2. ide.requestLibInfo = requestLibInfo;
  3. var libs = ide.requestLibInfo();
复制代码
新增了ide.requestLibInfo = requestLibInfo;这行代码后,在ide.installLib里调用的ide.requestLibInfo也会被替换成我的函数。
这样就只多了一行代码,不用去重写多个函数。如果在多线程使用的话,同样需要新增这行代码。
hook

上面这个思路其实很常见,专业名词的话是hook。比如我之前写的Python调用ocr,有人提了个需求:https://github.com/kanadeblisst00/wechat_ocr/issues/6

这个需求很小众,根本不用去修改库代码来实现,只需要hook一下print就能做到:
  1. import builtins
  2. def my_print(*args, **kwargs):
  3.     pass
  4. builtins.print = my_print
复制代码
如果只想过滤某个模块的print,可以通过inspect模块获取上上层调用的函数和所在模块,根据函数名或模块名就能过滤掉指定模块的print打印
  1. import builtins
  2. def caller_info():
  3.     # 获取当前帧的上一帧,即调用者的帧
  4.     caller_frame = inspect.currentframe().f_back.f_back
  5.     # 获取调用者所在的模块和函数
  6.     caller_module = inspect.getmodule(caller_frame)
  7.     caller_name = caller_frame.f_code.co_name
  8.     # 如果能获取到调用者模块,则提取模块名;否则为None
  9.     module_name = caller_module.__name__ if caller_module else None
  10.     return module_name, caller_name
  11. old_print = builtins.print
  12. def my_print(*args, **kwargs):
  13.     module_name, caller_name = caller_info()
  14.     if "ocr" not in module_name:
  15.         old_print(*args, **kwargs)
  16. builtins.print = my_print
复制代码
本文由博客一文多发平台 OpenWrite 发布!

来源:https://www.cnblogs.com/kanadeblisst/p/18098123
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具