在 window 系统下。
1、不同版本的 python 用 pyinstaller 打包exe详细步骤
此方法,也适用绿色(免安装)版的python打包。
1、首先在 cmd 中 cd 到需要打包的代码文件加中,
也可以直接在文件夹上方输入 cmd 直接进入文件夹中。如下图所示:
2、从需要用的 python版本 的安装目录下的 Scripts 文件夹中找到 pyinstaller.exe 文件,右键属性打开。然后复制完整的 路径名,如下图:
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后缀的文件)
用记事本打开,对其进行编辑。
在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了。
4、打包程序使其具备管理员运行的权限
加上--uac-admin
参数
即:
pyinstaller --onefile --uac-admin script.py
官方文档参考
ps:
可用 auto-py-to-exe 包进行快速生成 exe 文件。
github地址
====================================================
如果打包时报错:
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position ***[某个数字]: invalid continuation byte
解决办法:在cmd 中输入 chcp 65001
CHCP 是一个计算机指令,能够显示或设置活动代码页编号。
65001: UTF-8代码页
950:繁体中文
936:简体中文默认的GBK
437: MS-DOS美国英语