相信很多朋友对QT程序的依赖问题脑壳痛,我使用pyside6写的记事本只有基本的文件读取修改,设置,正则以及简单的python语法高亮等功能,使用pyinstaller打包后体积达到了夸张的110M - -!使用innosetup打包后体积还有30m
接下来尝试了各种方法,什么虚拟环境打包,什么UPX压缩,都放弃了,原因是因为我偏好pyinstaller的-D选项,启动速度贼快,而UPX压缩会损伤记事本的启动速度,这是无法接受的,甚至在.spec文件中的exclude(剔除)选项中,模块名字排列了几十个,也仅仅使体积减少了10M而已,最终决定进入dist目录下的PySide6手动精简,我使用最原始,最笨,最繁琐,也是目前最好的方法:
进入dist\JQEdit\_internal,把文件按大小排列,先把文件后缀改成.bak,再启动pyside6写的记事本,如果没报错,并且外观与启动速度没有损失就可以把这个文件删除了,报错了就去掉.bak改回文件名,保留它!
以记事本为例,像那些什么openssl.dll,OpenGL.dll ,Network*.dll,VCRRUNTIME.dll,virtualkeyboard.dll完全用不到,统统格删勿论,目录结构不要破坏,只删文件,像translations里面的文件我是统统删除,因为我自己有翻译文件,还有plugins目录下,很多都可以删除,保留目录结构。一路下来,记事本体积从100多M缩小到了46M,哈哈哈哈。并且启动速度与其他功能完全没有削弱
使用innosetup制作成安装包后,体积从30M缩小到15M,嘻嘻
人生就是不断的优化,- -!
然后,下次不需要手动了,一步到位:
@echo off
REM 检查系统是否安装 Python
python --version > nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
echo Python 未安装,请先安装 Python。
pause
exit /b
)
REM 检查系统是否安装 PyInstaller
pyinstaller --version > nul 2>&1
IF %ERRORLEVEL% NEQ 0 (
echo PyInstaller 未安装,请先安装 PyInstaller。
pause
exit /b
)
REM 检查系统是否安装 Inno Setup
if exist "C:\Program Files (x86)\Inno Setup 6\Compil32.exe" (
echo Inno Setup 已安装。
) else if exist "C:\Program Files\Inno Setup 6\Compil32.exe" (
echo Inno Setup 已安装。
) else (
echo Inno Setup 未安装,请先安装 Inno Setup。
pause
exit /b
)
REM 检测完毕,开始打包exe
echo python,pyinstaller已经安装,即将打包成exe...
python -m venv venv
echo 创建虚拟环境
call venv\Scripts\activate
echo 激活虚拟环境成功
timeout /t 1 > nul
:: pyinstaller -D -w --icon="resources\JQEdit.ico" --add-data="resources\*;resources" JQEdit.py
pyinstaller --clean JQEdit.spec
echo 打包完成
timeout /t 2 > nul
echo 开始执行精简程序:
timeout /t 1 > nul
set count = 0
del dist\JQEdit\_internal\libcrypto-3.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\libcrypto-3.dll
set count = 0
del dist\JQEdit\_internal\select.pyd
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\select.pyd
del dist\JQEdit\_internal\unicodedata.pyd
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\unicodedata.pyd
del dist\JQEdit\_internal\VCRUNTIME140.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\VCRUNTIME140.dll
del dist\JQEdit\_internal\VCRUNTIME140_1.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\VCRUNTIME140_1.dll
del dist\JQEdit\_internal\_bz2.pyd
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\_bz2.pyd
del dist\JQEdit\_internal\_decimal.pyd
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\_decimal.pyd
del dist\JQEdit\_internal\_hashlib.pyd
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\_hashlib.pyd
del dist\JQEdit\_internal\_lzma.pyd
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\_lzma.pyd
del dist\JQEdit\_internal\_socket.pyd
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\_socket.pyd
del dist\JQEdit\_internal\PySide6\MSVCP140.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\PySide6\MSVCP140.dll
del dist\JQEdit\_internal\PySide6\MSVCP140_1.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\PySide6\MSVCP140_1.dll
del dist\JQEdit\_internal\PySide6\MSVCP140_2.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\PySide6\MSVCP140_2.dll
del dist\JQEdit\_internal\PySide6\opengl32sw.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\PySide6\opengl32sw.dll
del dist\JQEdit\_internal\PySide6\Qt6Network.dll
set /a count+=1
echo 已经删除:dist\JQEdit\_internal\PySide6\Qt6Network.dll
del dist\JQEdit\_internal\PySide6\Qt6OpenGL.dll
set /a count+=1
echo 已经删除:dist\JQE