用PyInstaller制作Python代码的可执行文件

旧城冷巷雨未停 提交于 2020-08-17 06:41:24

目录

 

一、安装pyinstaller库

二、执行生成exe文件

三、命令分析

(一)、基础命令

(二)、将库文件单独存放在目录中

(三)、利用spec文件进行打包

四、动态导入的库

5、踩坑记录

1、pyinstaller打包exe文件闪退解决方案


一、安装pyinstaller库


直接命令行pip安装

pip install pyinstaller

二、执行生成exe文件

我们现在有一个雷霆战机的小游戏, 名为plane_war.py

现在我们打开cmd, 进入到该目录下

输入下面的命令

pyinstaller plane_war.py --workpath E:\tmp\plane_tmp --distpath E:\plane --icon="E:\yun_project\Thunderfighter\img\thunderfighter.ico" --runtime-hook="E:\yun_project\Thunderfighter\runtimehook.py"

生成后的效果

 

三、命令分析


(一)、基础命令

  • pyinstaller 指定了当前目录需要制作的python文件
  • –workpath 指定了制作过程中临时文件的存放目录
  • –distpath 指定了最终的可执行文件目录所在的父目录
  • –icon="" 指定了应用程序图标,必须是ico格式
  • –runtime-hook="" 将库文件放到单独的一个目录中
  • –noconsole 有图形界面可用该参数去掉DOS黑窗口,引用该参数就可以啦,它的缺省值就是True,只对windows有效

注意:

1、能够from xxx import yyy就尽量不要import xxx,这样可以减少打包后的体积。

2、最好在纯python环境下打包,在anaconda环境下,会生成很多不必要的包

在线转ico网址 https://www.zamzar.com/convert/png-to-ico/

或者直接取图标网站获取:https://www.easyicon.net/

noconsole 有图形界面可用该参数去掉DOS黑窗口, 我在生成时引用该参数后,生成的EXE文件没法执行了,而其他步骤没有问题,如果没有必要不要使用。

 

(二)、将库文件单独存放在目录中


上面这样操作后,大家可以发现我们只要运行Send_email.exe文件,但是该目录下却有很多其他的.dll 之类的库文件。
这使得我们要寻找并运行程序时,要在这么多文件中找到 .exe 文件,比较费劲。

我们可以通过如下方法,把这些库文件放到 单独的一个 目录中。 这样.exe所在的目录就显得比较清爽了,也好找到.exe文件了。

我们添加一个Python代码文件,名为 runtimehook.py
其内容如下

import sys
import os

currentdir = os.path.dirname(sys.argv[0])
libdir = os.path.join(currentdir, "lib")

sys.path.append(libdir)
#os.environ['path'] += ';./lib'

上面的命令指定 生成的.exe运行时,会先执行 runtimehook1.py 里面的代码。

这样就会指定 .exe 程序所在的目录下面的lib目录:

Python库搜索路径,这是由 sys.path.append(libdir) 指定的。
动态链接库文件的 搜索路径,这是由 os.environ[‘path’] += ‘;./lib’ 指定的。
上面的命令执行结束后,我们进入到目录distpath\send-eamil 中,新建一个名为 lib 的目录,把除了下面的几个文件之外的所有其他文件都放到lib目录里面。

base_library.zip  
byhy.exe  
byhy.exe.manifest  
python38.dll  

 

我按照博主的步骤操作以后, 生成EXE文件就没法正常运行了, 可能是我没有操作对,还是需要再实验一下。

 

(三)、利用spec文件进行打包

一般而言,pyinstaller的基本用法已经够用了,但是有特殊需求,比如打包图片资源文件时,就必须用到它的高阶功法了。

首先得了解spec文件,简而言之,spec文件就是一份告诉pyinstaller如何打包的配置文件。
可以通过pyi-makespec demo.py来生成demo.spec文件。其内容如下:

# -*- mode: python -*-

block_cipher = None

resources = (("inspurer.db", "."), ("dlib_face_recognition_resnet_model_v1.dat", "."),
 ("shape_predictor_68_face_landmarks.dat", "."), ("close_logcat.png", ".")
 , ("open_logcat.png", "."), ("finish_register.png", "."), ("new_register.png", ".")
 , ("start_punchcard.png", "."), ("end_puncard.png", "."), ("index.png", "."))

a = Analysis(['workAttendanceSystem.py'],
             pathex=['C:\\Users\\lenovo\\Desktop\\test\\python'],
             binaries=[],
             datas=resources,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='workAttendanceSystem',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='workAttendanceSystem')

对于上面这个文件,需要注意两点:

除了resources配置是我添加修改之外,其余全是自动生成,这个配置是用来添加资源文件的。
pathex是工程的根目录。

生成并配置好spec文件后,我们可以通过pyinstaller demo.spec来执行打包任务。

可以通过先执行一遍打包命令,然后会自动生成spec文件,然后再修改spec文件。

 

四、动态导入的库

有的时候,我们运行打包好的程序,会出现导入库错误的提示,比如下面

ImportError: could not import module 'PySide2.QtXml'

PyInstaller 没法分析出动态导入的库有哪些,我们可以通过命令行参数 --hidden-import 告诉它。

比如,如果我们运行出现

could not import module 'PySpder.QtXml'  

错误 , 就可以这样

pyinstaller httpclient.py  --hidden-import PySpider.QtXml

好啦,本期的分享就到这。小伙伴们如果喜欢的话,欢迎点赞评论走一波。如果有不足之处,还请多多指正呀。
 

5、踩坑记录

1、pyinstaller打包exe文件闪退解决方案

打开cmd,  进入到文件夹中执行EXE文件, 可以看到错误信息,然后根据错误信息进行改正

在这里插入图片描述

参考文章:

1、https://blog.csdn.net/m0_46683744/article/details/106201841

2、https://blog.csdn.net/weixin_44493841/article/details/97887009

3、https://blog.csdn.net/bearstarx/article/details/81054134

4、https://www.jianshu.com/p/48f6dea265eb

5、https://zhuanlan.zhihu.com/p/65731845

6、http://legendtkl.com/2015/11/06/pyinstaller/

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!