当前位置: 首页 > 科技观察

Python打包的Exe程序避坑指南

时间:2023-03-19 23:07:41 科技观察

本文转载自微信公众号《Python中文社区》,作者杨冰。转载本文请联系Python中文社区公众号。写完一个python程序,如何才能快速把代码分享给别人,尤其是对于初学者来说,能够把自己的代码打包成exe程序,传到别人的电脑上运行,是一件很有成就感的事情。好在python自带了简单的打包程序,让很多人过上了程序员的瘾。目前流行的打包库有py2exe、pyinstaller和cx_Freeze。但是python的运行环境复杂,编写的程序往往要借助很多额外的函数库来实现,这对于简单的打包会造成一定的困难。经历过多次打包失败和成功后,感觉pyinstaller的成功率最高,所以有必要写一篇pyinstaller的规避指南。1.安装使用python的pip安装。在cmd窗口使用pipinstallpyinstaller,安装完成。然后配置环境变量。2、使用,例如,在程序6.py所在的文件夹中打开cmd窗口。一般输入pyntaller-F**.py(下面解释命令符号的具体含义),回车开始打包。如果顺利的话,会有一个反馈打包成功,如下图。这个时候就说明文件已经打包好了。打包后的exe程序放在dist文件夹下,使用的时候把它剪下来即可。如果你运气好或者程序本身比较简单,那么这个exe可以在任何电脑上运行。但这通常并不那么容易。pyinstaller的使用有很多坑。包装的开始,也是修复的开始。三、遇到坑和填坑1、文件路径中不能出现中文,否则打包过程中会直接出现如下错误。这个时候把文件夹和程序名改成英文或者数字再重新打包即可。打包后可以改回exe的名字。2.导入钩子文件丢失。有时候即使打包成功,运行exe的时候,还是会报错,死机。如果错误是:FileNotFoundError:[Errno2]Nosuchfileordirectory:...那就是缺少hook文件,需要在pyinstaller安装路径的hook中添加自定义hook。hook文件的命名约定为:hook-[库名].py。比如我在打包程序中使用了口吃和分词的函数库,那么我要创建一个hook-jieba.py,写:fromPyInstaller.utils.hooksimportcollect_data_filesdatas=collect_data_files("jieba")放到~\Lib\site-packages\PyInstaller\hooks,再次运行pyinstallerpackaging即可解决该问题。3.Missingimportfunctionlibrarymodule如果报错是nomodulenamed“pandas._libs.skiplist”,则需要手动导入库。解决方法是打开生成的spec文件,找到hiddenimports=[],添加要添加的库,添加修改如下,hiddenimports=["pandas._libs.skiplist"],然后删除其中的exe文件dist,用spec文件重新打包,pyinstaller**.spec。这将解决问题。4、花式包装与包装有关的几个重要参数如下。-F,将所有内容打包成一个exe,方便发送,一般使用该参数。-c,这个是windows系统的默认选项,使用这个参数,运行的时候会有一个黑色的窗口控制台。-w,使用该参数,运行时不会出现黑窗控制台。-i使用此参数生成自定义图标exe,后面是ico图片的地址。例如pyinstaller-iD:\icons\demo.ico**.py5.结论将程序打包成exe发送出去或供用户下载。小程序也能达到同样的效果,而且更方便用户使用,也在向轻应用方向发展。另外对于专业用户,也可以通过github和api进行传播。随着网络观念的深入和5G时代的到来,相信有更好的方式可以更安全、更快捷、更私密地将工具的功能交付给需要的用户。作者:杨冰,在银行写代码的心理学家。