首页 > 编程知识 正文

python用pyinstaller编译成exe,pyinstaller 多个.py打包exe

时间:2023-05-04 11:24:36 阅读:210398 作者:4500

目录

 

一、安装pyinstaller库

二、执行生成exe文件

三、命令分析

(一)、基础命令

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

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

四、动态导入的库

5、踩坑记录

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


一、安装pyinstaller库


直接命令行pip安装

pip install pyinstaller 二、执行生成exe文件

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

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

输入下面的命令

pyinstaller plane_war.py --workpath E:tmpplane_tmp --distpath E:plane --icon="E:yun_projectThunderfighterimgthunderfighter.ico" --runtime-hook="E:yun_projectThunderfighterruntimehook.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 sysimport oscurrentdir = 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’ 指定的。
上面的命令执行结束后,我们进入到目录distpathsend-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 = Noneresources = (("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文件, 可以看到错误信息,然后根据错误信息进行改正

6、补充 :pyinstaller基本用法

假如我们要打包一个demo.py文件,基本过程是:

打开cmd,并切换到demo.py文件所在的目录,注意路径中不要有中文
执行命令:pyinstaller demo.py
在当前的目录下,将会生成两个文件夹:build和dist。dist里面就是所有可执行文件,点击demo.exe就能运行了。

pyinstaller指令的常见可选参数:

可选参数格式举例功能说明-Fpyinstaller -F demo.py只在dist中生产一个demo.exe文件。-Dpyinstaller -D demo.py默认选项,除了demo.exe外,还会在在dist中生成很多依赖文件,推荐使用。-cpyinstaller -c demo.py默认选项,只对windows有效,使用控制台,就像编译运行C程序后的黑色弹窗。-wpyinstaller -w demo.py只对windows有效,不使用控制台。-ppyinstaller -p E:pythonLibsite-packages demo.py设置导入路径,一般用不到。-ipyinstaller -i D:file.icon demo.py将file.icon设置为exe文件的图标,推荐一个icon网站:icon

上面的可选参数可以组合使用,比如pyinstaller -F -i D:file.icon demo.py。
能够from xxx import yyy就尽量不要import xxx,这样可以减少打包后的体积。



作者:inspurer
链接:https://www.jianshu.com/p/48f6dea265eb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

参考文章:

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/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。