准备用Python开发一个exe应用程序。
首先写出代码,然后通过pyinstaller封装成一个exe文件,之后正常来说,双击程序就可以运行了。 但是在实际开发过程中遇到了很多问题。
一、首先是按照打包工具pyinstaller,支持python2、python3的所有版本。使用命令行: pip install pyinstaller
在pip安装过程中,可能会因为网速或其他原因导致安装失败。所以为了提高安装速度采取了博客中的方法。
二、然后cmd进入.py文件所在的文件夹,也可以在.py文件所在的文件夹使用 shift加右键,直接进入。接着在命令行输入 pyinstaller -F -w test.py
,这里一些博客中加了‘test.py’,这会报错。随后,会在目录下生成几个文件夹,发现在dist
文件夹中就出现了exe软件。双击,查看是否可以运行程序。需要注意的是,在生成exe程序时,可能会被电脑上的杀毒软件误删,因此可以关闭杀毒软件进行相关操作。
这里,我遇到了以下问题:
1、运行 pip install pyinstaller 打包时提示报错:UPX is not available.
查阅相关资料, 找到了解决办法。https://blog.csdn.net/chentianveiko/article/details/107083912
pyinstaller使用UPX压缩, 所以需要安装一个UPX:
(1) 到官网 https://upx.github.io/ 下载了UPX, 下载下来是一个压缩包。
(2) 解压得到 upx.exe文件
(3) 把exe文件拷贝到pyinstaller所在目录下。
(4)重新运行pyinstaller命令发现运行成功: UPX is available。
2、双击运行程序报错。
以及另一个VCRUNTIME140.dll文件,报错意思是两个dll文件的路径不对或者版本及其他原因。首先将两个文件复制到开发文件同一目录下。
发现问题同样存在。
查阅了相关资料。如https://blog.csdn.net/weixin_39595453/article/details/100038181、https://blog.csdn.net/zj910092147/article/details/72912248?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control、https://blog.csdn.net/karmacode/article/details/90256460?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control、https://blog.csdn.net/qq_19600871/article/details/81662431?utm_medium=distribute.pc_relevant.none-task-blog-title-15&spm=1001.2101.3001.4242都没有解决问题。
【解决方法】:pyinstaller --clean --win-private-assemblies -F XXXX.py
【参数说明】
–clean清除pyinstaller的缓存并移除之前建立的临时文件,
–win-私人组件把跟这个程序捆绑的共享的组件都改为私有的
调试阶段不用-w,因为如果有错误就打印在终端了而不是闪退
编辑spec文件添加第三方DLL。例如cx_Oracle模块用到的DLL,按如下格式编辑test.spec文件的datas=[]参数;
datas=[('oci.dll','.'),('oraociei11.dll','.')]
最后在博客https://blog.csdn.net/qq_38232378/article/details/95767597 中找到解决办法:
解决vcruntime140.dll没有被指定在Windows上运行
关闭upx即可
pyinstaller -F --noupx test.py
运行成功。
注意:pyinstaller -F -w test.py
命令中-w
的意思是直接发布的exe应用带命令行调试窗口,在指令内加入-w命令可以屏蔽;-F
的意思是使用-F指令可以把应用打包成一个独立的exe文件,否则是一个带各种dll和依赖文件的文件夹。