本文转载自微信公众号「Python中文社区」,作者杨炳。转载本文请联系Python中文社区公众号。

写完一个python程序之后,如何才能快速地将代码分享给别人,尤其对于初学者来说,能把自己的代码包装成一个exe程序并传递到别人电脑上运行,那是一件非常有成就感的1 O ! n $ r .事。~ X W m好在python自带简易打包程序,让很多人能过一把当程序员的瘾。目前流行的打包库就有py2exe、pyinstaller和cx_FrH M 0 Geeze。

但python的运行环境复杂,编写的程序往往是借助了很多附加的功能库来实现,对简单的打包会造成一定困难。本人也是在经历了多次的打包失败和成功的经历之后,觉得pyinstaller的成功率最高,所以有必要针对pyinstaller写一篇避坑指南。

一、安装

使用python的pip安装,在cmd窗口,z C ? y使用pip install pyinsta] V } _ a l 2 nller,即安装完成。然后配置好环境变量。

二、使用

例如在程序6.py所在文件夹打开cmd窗口。一般输入pyintaller -F **.py(命令符的具体含义在下文中解释),回车Z 2 ; k E j即开始打包。顺利的话,会出] C E %现打包成功的反馈,如下B V D 7 D q d j图,这时,就说明文件已经打包完成了。dist文件夹里面就放着打包完的exe程序,使用时剪切出来就行了。如果运气好或者本身程序` } D { G w I D H比较简单,那这个exe就q ~ 5 a e t 9能在任何电脑运行了。

但往往没这么容易,pyi` i o G Hnstaller在使用中有很多坑,打包的开始,也是修补的开始。

三、\ | J L遇坑填坑

1.文件路径中不能出现中文

否则会在] 6 : e F ^ E `打包过程中直接出现如下报错。这时只要把所在文件夹7 \ \ ~ 7和程序名字改成英文或者数字重新打包即可。可以打包完再将exe的名字改回来。

2.缺少导入hm W P A J G #o* 9 5 & w Hok文件

有时即使打包成功了u u H C,在运行exe时候,还是会有报错并闪退。

如果报错为:FileN4 C [ ^ 3 +otF. W a f % g y 8 youndError: [Errno 2] No such file or directory:……

那是缺少hook文件,要在pyinstaller的安装路径里的hook增加一个自定义的hook。hook文件的d $ 9 a h R t b命名规范为: hook-【库名】.py+ 0 ` U A w L K。例如以我在打包程序中用了结巴分词这个功能库为例,那我要建立一个hook-jiN a K ; g U ieba.py,并写入:U * z

  1. fromPyInstaller.utils.hooksimportcollect_data_files
  2. datas=collect_data_files("jieba")

然后放到~\Lib\site-packages\P/ k myInstaller\d D ghooks中去,再次运行pyinstaller打包p A b 8既可解决该问题。

3.缺少导入功能库模块

如果报错为 no moduler named “pandas._libs.skiplist”: p 8 r,那就要手动import库,解决方法打开生成的spec文件,找到 hiddenimpor. * } pts=[],加上要添加的库,将其改动如下,hiddenimports=[“pandas._libs.skiplist”],然后删除dist里面的exeA t Q –文件,重新用spec文件打包,pyinstaller **.spec。即可解决该问题。

四、花式打包

涉及到打包的几个重要参数如下。

  • -F,将所有内容打包到X 7 d 8一个exe中,方便发送9 ! [ V h F & n ;,一般都使用这个参数。
  • -c,此为windows系统的默认t M h n Z 1选项,使用这个参数,运行时会有一个黑^ { 6 i c窗控制台。
  • -w,使用这个参数,运行时不会出现黑窗控制台。
  • -i 使用这个参数用于生3 N 9 p N u w z (成自定义图标的exe,在这后面要k i d X ( x + G e加上ico图片的地址。例如,pyinstaller -i D:\icons\demo.ico **.py

五、结语

将程序打包成exe发送出去或者供用户下载,是一个比较传统的传播方式,并且比较笨重,其实用简单的H59 2 z \ F v或者小程序就能实现一样的效果,对用户而言也更方便,也是朝着R [ P W }轻应用的方向发展。此外,对于专业用户还能通过github和api等方式传播。随着网络观念的深入人心和5G时代到来,相信有更好的方式能更安@ Q m } o =全、快捷、私密地将工具的功能传递给所需要的用户。

作者:杨炳,心理学者在银行写代码。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注