pyinstaller 打包成 exe 遇到的一些坑

在 window 系统下。

1、不同版本的 python 用 pyinstaller 打包exe详细步骤

此方法,也适用绿色(免安装)版的python打包。
1、首先在 cmd 中 cd 到需要打包的代码文件加中,
也可以直接在文件夹上方输入 cmd 直接进入文件夹中。如下图所示:
pyinstaller 打包成 exe 遇到的一些坑_第1张图片
2、从需要用的 python版本 的安装目录下的 Scripts 文件夹中找到 pyinstaller.exe 文件,右键属性打开。然后复制完整的 路径名,如下图:
pyinstaller 打包成 exe 遇到的一些坑_第2张图片
3、在第一步打开的 cmd 窗口中,输入 第二步复制的内容,再加上相关参数即可。
在这里插入图片描述
参数说明:
1、-F :加上这个参数,打包成一个EXE文件,如果不加则打包成一个文件夹。
2、 -w(小写):加上这个参数程序运行时不显示 控制台窗口(黑黑的那个窗口),不加上则显示。
3 和 4、-i:设置打包程序的图标,后面跟的是引用图标的名称,图片格式为ico格式。省略则显示默认图标。
5、 需要打包的 py 文件名(文件名最好不要为汉字,可能会出错)。
《具体参数介绍》

注:如果是正常安装版的python,直接 pyinstaller [参数] name.py 即可。
如果是 用 venv 的虚拟环境,先用 pip install pyinstaller安装后,再用 pyinstaller 命令即好。

2、pyinstaller 打包多进程、线程

用 pyinstaller 打包好exe后,双击运行,会出现无限循环的进入主程序的情况。
此时只要在调用多进程的前面加上如下的代码即可:

if __name__ == '__main__':    # 主要得加这句和下面这句。
    mp.freeze_support()       # 这句得加上,要不打包的程序就进不了下面的子进程了。
    p1 = mp.Process(target=callback, target=(, ))    # 示例进程
    p1.start()

知识点:
1、因为开启子进程是不支持打包exe文件的,所以会不停向操作系统申请创建子进程,
而这个代码 multiprocessing.freeze_support() 作用就是支持打包到Windows的EXE文件。

2、多进程的程序运行后,如果直接关闭控制台窗口,那么整个程序都会退出。
如果是 进入 任务管理器,单独结束 控制窗口 的进程,如果子进程不是守护进程,那么子进程还是会继续运行。

3、如果是多线程的,则没这个问题,可以直接打包。
但有个小提示, 如果是 tkinter 的图形界面运行的,是多线程的话,如果子线程不是守护线程,那么关掉主界面后,子线程会继续运行。
如果也是控制台窗口的话,效果和上面 2 提到的进程效果一样。

3、pyinstaller 打包一个EXE 并加入内置图片

1、先按正常方法打包:

pyinstaller -F -w name.py

2、在生成的文件中找到 name.spec 文件 (.spec后缀的文件)
用记事本打开,对其进行编辑。
pyinstaller 打包成 exe 遇到的一些坑_第3张图片

在datas列表中添加数据格式为:
datas = [(‘source_path1’, ‘exe_dir1’), (‘source_path2’, ‘exe_dir2’)]
注释:
source_path1 :资源文件。
exe_dir1:把资源文件放在EXE程序中的文件夹。可以直接使用 英文的句号 即 ”.“,表示把资源文件放在EXE程序的顶级文件夹中。
列如 要把图片 ”C:\pic\name.jpg“ ,放入打包好的EXE程序中的 img文件夹中,可以这样写: datas=[(‘C:\pic\name.jpg’, ‘img’),]

3、最后得在源代码的图片路径引用中进行如下修改:

import os,sys
if getattr(sys, 'frozen', False):    # 查找 sys 中有没 frozen 属性,如果没有返回Fasle。
      							     # sys中的 'frozen' 属性 是打包成 一个EXE文件特有的属性。
        bundle_dir = sys._MEIPASS   
else:
        # 这是在没打包成一个EXE文件的情况下,文件的当前路径。
        bundle_dir = os.path.dirname(os.path.abspath(__file__))

filename ='pic.png'  # pic.png为图片名。
file_path = os.path.join(bundle_dir, filename) 

PyInstaller会将文件夹的路径信息存储在sys.MEIPASS中。当使用的是单文件打包的方式,sys.MEIPASS的值就是程序运行时创建_MEIxxxxxx临时目录的绝对路径。
路径一般在 C:\Users\用户名\AppData\Local\Temp\ _MEI1554654 (一串数字结尾的)

4、修改好 .spec 文件,和源代码,再次在cmd中输入:

pyinstaller name.spec

就可以生成带图片的EXE了。

官方文档参考
ps:
可用 auto-py-to-exe 包进行快速生成 exe 文件。
github地址

你可能感兴趣的:(技术分享,python,pyinstaller,exe,打包)