最近遇到的一些比较坑的bug

Bug:读取两个文件,然后输出这两个文件的内容。第一个文件输出始终为空,第二个文件可以正常输出。 解决:第一个文件损坏了(具体是什么原因未知),我将第一个文件的内容复制到一个文件中就可以正常使用了。 教训:永远要质疑输入的合法性 Bug:使用Gradio,按钮绑定了一个回调方法,这个方法内部调用了OpenAI做了对输入的两个文件进行处理。结果总是第一个文件处理完之后就停止了。 解决:实际上不是在第一个文件处理完之后停止,而是LLM处理第一个文件花费了大约1分钟,而Gradio默认一分钟回调方法没返回结果就超时失败。所以,设置Gradio应用启动为queue模式,取消超时等待。 教训:任何一个方法执行时间很长就得考虑是否存在超时失败 Bug:测试人员测试我写的的一套上传下载照片逻辑时,同时在测试环境测试了我的上传和下载接口,结果是下载下来的照片无法识别。 解决-1:这里有一个关键点,下载下来的照片无法识别这个问题,我一开始以为是加解密错误导致照片出现问题。但是加解密如果异常应该在程序中就报错。最后发现,下载下来的图片大小是0kb,但是Windows自带的照片预览会直接说无法识别该类型。 教训-1: 对于存储在磁盘上的文件一定首先检查文件大小(这让我想起来实习期的一个问题是因为文件本质是个软连接,如果第一时间查看大小就能看出问题) 解决-2: 代码中的上传下载逻辑我都有详细覆盖性很强的单元测试,本地都上传下载过,不应该出问题。遂回滚代码尝试,发现旧的代码也下载不了,经排查发现是测试环境的host配置错误了。 教训-2: 涉及到这种代码改造(不修改旧逻辑)的测试,在测试之前应该第一步先校验旧代码的可用性,我给它取个名字叫基准测试。 解决-3: 测试过程中,测试使用了另一个服务的接口间接调用了本服务的上传接口,结果走不通。在一开始,下意识认为是本服务的问题,因为另一个服务被使用的接口没有被改造。但排查后发现是另一个服务挂了(挂的原因是我在该服务上做了其他修改,导致服务没启动的了) 教训-3: 间接调用优先确保服务可用性 解决-4: 另一个服务挂掉的原因,是外部依赖更换了服务地址,所以代码中需要修改,而修改的点是另一位同事在改,今天上线并没有合并到master分支,导致我合并master分支时没有合到这部分代码。 教训-4: 如果代码有意料之外的问题,第一时间先看一下其他同事的开发分支有没有一些关键操作没有合并到master。同时也知道了合并master,以及branch命名,commit规范的重要性(要是都糊写一通,根本就没法快速排查)

July 11, 2023 · 1 min

Python的路径和版本管理

我现在的mac上已经安装了如下几个python /opt/homebrew/opt/python@3.10/bin/python3.10 /usr/bin/python3 /Library/Frameworks/Python.framework/Versions/2.7/bin/python 这些包从哪里安装的 homebrew的安装包是通过homebrew使用brew命令进行安装的,可以使用brew uninstall进行卸载,如果brew安装的其他项目有使用python,就无法直接卸载了。 /usr/bin/python3这个python是系统自带的,不推荐卸载,/usr/bin/python3应该是一个硬链接。 python2是为了使用npm安装不得已下载的。 pip install安装的包放在哪里? 对于mac自带的python3,系统做了一些工作使得这个的安装包路径在/Users/<user_name>/Library/Python/3.8/lib/python/site-packages下 参考博客https://frostming.com/2019/03-13/where-do-your-packages-go/ Python 是如何寻找包的 现在大家的电脑上很可能不只有一个 Python,还有更多的虚拟环境,导致安装包的时候,一不小心你就忘记注意安装包的路径了。首先我们来解决找包的问题,这个问题回答起来很简单,但很多人不知道这个原理。假如你的 Python 解释器的路径是 $path_prefix/bin/python,那么你启动 Python 交互环境或者用这个解释器运行脚本时,会默认寻找以下位置1: $path_prefix/lib(标准库路径) $path_prefix/lib/pythonX.Y/site-packages(三方库路径,X.Y 是对应 Python 的主次版本号,如 3.7, 2.6) 当前工作目录(pwd命令的返回结果) 这里如果你用的是 Linux 上的默认 Python,$path_prefix 就是 /usr,如果你是自己使用默认选项编译的,$path_prefix 就是 /usr/local。从上面第二条可以看到不同 Python 版本的三方库路径不同,如果你把 Python 从 3.6 升级到 3.7 那么之前装的三方库都没法用了。当然你可以整个文件夹都拷贝过去,大部分情况不会出问题。 几个有用的函数 sys.executable:当前使用的 Python 解释器路径 sys.path:当前包的搜索路径列表 sys.prefix:当前使用的 $path_prefix 为什么vscode的终端使用的python3是brew的而系统的终端用的默认的python3 我重新打开了一个系统的终端之后也变成使用brew自带的了,说明是环境变量设置的问题。 使用echo $PATH查看环境变量,得到结果 /Users/chuhuilong/.nvm/versions/node/v10.15.3/bin:/Library/Frameworks/Python.framework/Versions/2.7/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin 管理python 使用python遇到的最大问题就是python的版本管理了,虽然使用其他的语言也会有版本管理问题,但是python最大的难点在于,python2和python3不兼容,并且它们的安装方式还有多种,安装下来的位置也都不同。另外有些系统比如mac自带python3,种种原因使得python的版本管理地位非常重要,没有好的版本管理,就不清楚自己在运行什么版本,下载的包也会丢在不同的地方。 pyenv 根据这篇文章https://opensource.com/article/19/5/python-3-default-mac,博主在安装另一个软件时也遇到了和我一样的问题,python版本太多太混乱。很多人遇到了这些问题,于是有了各种解决方案,其中pyenv受到了Moshe Zadka的推荐。 pyenv使用很简单 安装brew **install** pyenv 下载指定pythonpyenv install 3.10.0...

September 17, 2022 · 1 min