使用Pyinstaller打包应用程序时常遇到的问题和解决方法

使用Pyinstaller打包应用程序时常遇到的问题和解决方法

安装pyinstaller

命令行内输入如下命令

pip install pyinstaller

更新pyinstaller

命令行内输入如下命令

pip install --upgrade pyinstaller

打包应用程序

在需要打包的目录下命令行中执行以下命令,xxx.py是程序的入口文件,有多个文件需要打包时,也只需提供入口文件即可

pyinstaller xxx.py

打包完成后在当前路径下生成了dist\xxx的文件夹,文件夹内包含xxx.exe可执行文件和_internal可执行文件执行所依赖的库。注意这里打包的生成产物不包含程序内依赖的除py文件的其他文件,如程序内依赖其他文件,请将该文件移入对应路径。

需要特别注意的是,如果你的程序内使用了多进程,在执行exe开启另外一个进程的时候,界面可能会重复开启。解决办法是在入口文件的if __name__ == '__main__':加上multiprocessing.freeze_support() multiprocessing.freeze_support() 只需要加入一次就可以了,如果程序中多次加入,可能会引起其他问题。

if __name__ == '__main__':
 multiprocessing.freeze_support()
	pass

打包成单独文件

使用以上命令打包的程序执行需要依赖_internal文件夹内资源才能运行,可以使用以下命令将所有资源打包成一个exe可执行程序

pyinstaller -F xxx.py
pyinstaller --onefile xxx.py

这样在当前路径下生成了dist的文件夹,文件夹内就只有一个xxx.exe的可执行文件了。

打包不带命令行窗口

当使用以上命令打包程序时,程序执行会开启一个控制台窗口,使用以下命令打包成的exe执行时不会出现控制台窗口。

pyinstaller -F -w xxx.py
pyinstaller -F --noconsole xxx.py

如果你的程序中使用了subprocess.run``subprocess.Popen等执行命令时,使用以上两种打包的程序会在调用subprocess.runsubprocess.Popen等时控制台窗口一闪而过。可以使用如下解决方案:

  • subprocess调用时执行启动信息,以隐藏窗口
st = subprocess.STARTUPINFO()
st.dwFlags |= subprocess.STARTF_USESHOWWINDOW
st.wShowWindow = subprocess.SW_HIDE
result = subprocess.run(cmd, check=True, capture_output=True, timeout=5, startupinfo=st)

设置应用程序图标

应用程序图标应该使用ico文件。

可以使用PNG to ICO - Convert your PNG to ICO for Free Online (zamzar.com)等网站将png文件转换成ico文件。

pyinstaller -F -w -i <your .ico path> xxx.py

生成的exe的图标可能还是默认的python图标,这主要是windows资源管理器对图标的缓存问题引起的。可以将生成的可执行文件换个拷贝到其他路径或者打包时重命名解决。

pyinstaller -F -w -i <your .ico path> -n newname.exe xxx.py

任务管理器中存在两个一样的进程

当使用-F打包成一个单独的可执行文件时,程序运行需要被解压缩到一个临时目录下运行。第二个进程是实际的程序,第一个进程是在程序退出或者崩溃后清理临时目录。

因此不使用-F参数时,生成的可执行文件就会显示一个进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值