既然回到了书房,就把那套自动化打包脚本写完。团队那摊子事刚吵完,嗓子眼还发干,但手指一碰到键盘,那种熟悉的、能掌控一切的幻觉就回来了。比管人强。
下午跟技术合伙人又干了一架,为了一个客户临时加的、狗屁不通的图片批量去背景需求。他说人手排不开,我说这玩意儿不就是个算法调用加个壳吗,两天出不来?吵到最后,我摔门回自己家了。路上就想,去他妈的依赖别人,老子自己来。2016年那会儿,什么不是自己爬、自己写的?现在倒好,当了个小老板,连个exe都生疏了。
核心就两件事:用Python调用Rembg库做图片抠图,然后打包成一个Windows桌面软件,让销售那边能直接甩给客户用,不用再跟我解释怎么配环境、怎么装Python。听起来简单吧?PyInstaller打出来的包,在他妈的Win7上直接报错,缺MSVCP140.dll。我查了,这是Visual C++ 2015的运行库。团队里那帮小孩肯定说“让客户自己装一下呗”,放屁。我们要交付的是双击即用的东西,不是技术说明书。
搞到凌晨一点,方案定了。不用PyInstaller的–onefile单文件模式了,虽然干净,但解压慢、杀毒软件还老误报。用目录模式,手动把该塞的DLL都塞进去。在spec文件里加了一堆hiddenimports,把rembg依赖的onnxruntime、PIL那些隐式导入的模块全揪出来。最坑的是OpenCV,它有些动态库不会自动打包,得去虚拟环境的site-packages/cv2文件夹里,把那些.pyd和.dll文件手动复制到打包目录。对,就是这种脏活。
体积是另一个噩梦。一个简单的图片处理工具,打包出来快500MB。客户电脑要是C盘红了,销售第一个骂的就是我。用pipenv创建纯净虚拟环境,只装rembg和它的核心依赖。然后上PyInstaller的–exclude-module,把tkinter、test、unittest这些用不着的全砍了。还是大。最后发现是onnxruntime的锅,它默认带了CPU和GPU的providers。用onnxruntime-gpu替换onnxruntime,再在代码里显式指定只用CPU执行提供者,硬生生砍掉200多MB。这每一步,搜索引擎上都没有现成答案,全是靠旧时代爬虫练出来的、对错误日志的变态敏感,和一遍遍试出来的。
打包出来的文件夹,在三台不同系统的虚拟机里(Win7、Win10 ltsc、Win11)各测了五十张图。中间遇到一个路径包含中文就崩溃的bug,是Python的os.path在处理unicode时的老毛病,用pathlib重写了一遍文件读取逻辑。搞定了。
看着那个最终只有280MB的文件夹,里面是规整的exe和一堆dll。我给它重命名了一下,叫“Flovico_Rembg_Pro_v0.1”。Pro这个后缀是我自己加的,显得贵。这玩意儿背后没有团队协作,没有项目管理,只有我一个人,和一堆冰冷的依赖项。但它能跑,而且跑得很稳。
比开会、扯皮、安抚情绪、追着屁股要进度,爽太多了。我好像又回到了2017年,那个通宵写完一个爬虫,看着数据哗啦啦下来的瞬间。只是现在,我清楚这不过是下一次交付泥潭前的短暂喘息。明天还得回公司,面对那一地鸡毛。但至少今晚,这个叫“Flovico”的东西,是我一个人从头到尾控住的场。














