pipenv生成可执行文件
借python做了一个pdf转png的小程序,直接使用pyinstaller打包,发现生成的exe文件有90+MB之多。前篇博文里提到曾自制pdf查看器,就使用过pipenv虚拟环境来减少生成文件体积,不过是围绕pdf的生成和显示来讲,就没涉及到这些,今日则作些补充。
1.pip安装pipenv,执行pipenv shell进入交互界面,在其内安装多一次所需的依赖和pyinstaller,如不装依赖,生成不了exe或生成的exe运行不了,如不装pyinstaller,pipenv会调用物理机器环境的pyinstaller,而操作系统直接安装的pyinstaller关联众多不相干的依赖包,这是导致生成exe文件体积过大的直接原因(参自https://segmentfault.com/a/1190000042703272)。
2.pyinstaller -F *.py语句生成的exe文件在运行时会伴随一个黑色命令行窗口,调试有益,但会影响终端用户使用,屏蔽其的方法就是加上-w参数,pyinstaller -Fw *.py(参自小小猿若尘)
3.访问pdf文件需用到fitz依赖包,若是直接使用pip install fitz,在脚本状态下时可以运行的,生产exe时会报错:pyinstaller和pathlib不兼容,要求删了pathlib重试,可以选择继续,而在某些概率下执行生成的exe文件会报错:RuntimeError: Directory 'static/' does not exist ,这时就不得不卸载fitz,pip安装pymupdf(参自园里myrj),pymupdf竟然自带有fitz包。
4.小程序里有一个文件选择框限制只能选pdf的功能,照网上搜的写入
filedialog.asksaveasfilename(defaultextension=".png",filetypes=[("PNG Files",".png")])
报错:_tkinter.TclError: bad file type ".pdf", 需要在("pdf files", "*.pdf") 后面加个英文的逗号(参自园里水汐音)
5.fitz的get_pixmap找不到直接转换成PIL的Image方法,只能通过另存为图片文件再用open方法重新打开,循环中使用还用有单一文件名被锁定的问题,只能一页pdf一个png文件或者把写入操作嵌入到循环中。
24.06.28补充:
6.pipenv虚拟环境使用pyinstaller6.8还是会遇到可能病毒报错,同样的版本在非虚拟环境居然正常,一时摸不着哪出问题了,折腾来去还是使用vbox创建一个虚拟环境来编译py文件可靠,只安装所需的依赖包,代码简短的文件就可控制在30M以内。