将Python程序打包成exe文件
学习怎么打包python文件
转载:将python程序打包成exe文件
【引入几个问题】
一、什么是exe可执行文件?
exe文件英文全名是executable
file,翻译为可执行文件(但它不等于可执行文件),可执行文件包含两种,文件扩展名为.exe的是其中的一种。exe文件可以在Windows平台上直接双击运行!我们通常用的各种软件都是通过快捷方式打开的,而这个快捷方式的目标地址就是这个软件的一个exe文件。
二、为什么要将Python程序打包为exe可执行文件?
众所周知,Python程序的运行必须要有Python的环境,但是程序编出来是用的,如果是给别人用,而他/她的电脑上又没有Python程序运行的环境怎么办呢?总不能让他/她去安装一个吧?这时我们就要将Python程序打包为exe可执行文件,这样,在Windows平台下,就可以直接运行该程序,不论有没有Python环境。
三、为什么Python程序不能直接运行呢?
Python是解释性语言,它与C或者C++等语言不同,C或者C++都是要编译再运行的,(编译产生的文件就是exe文件),Python本质上只是对一段文本进行解释,类似于浏览器解析html文档,是不会产生任何exe程序的。
1. 打包单个文件
【步骤01】
【在命令行中用pip工具安装Pyinstaller模块】
pip install Pyinstaller
【步骤02】
【切换命令行的路径到你要打包的Python源文件的文件夹路径下】
【下面是我要打包的Python源文件(散点坐标图.py)及其文件夹路径】
【切换命令行路径】(不是文件路径)
cd 文件夹路径
【步骤03】
【执行Pyinstaller模块的功能】
Pyinstaller -F -w 文件名.py
【等待打包】
【打包成功的标志】
【步骤04】
【到原文件夹找到dist文件夹并打开】
【文件夹里面就是我们要的exe可执行文件了!双击即可运行!】
但是这样打包的Python程序一般会很大,因为它会把一些不必要的东西也打包进去了,(通常可能会达到几百MB的大小😂)这里我们采用创建虚拟环境的方式进行压缩,也就是下面的升级版
【升级版步骤01】
【创建虚拟环境】
conda create -n 虚拟环境名称(自定义) python=版本
【在创建的过程需要回复yes】
【升级版步骤02】
【激活虚拟环境】(我之前就已经创建了一个名为program的虚拟环境)
conda activate 虚拟环境名称
前面的(base)变成了(program)
这个虚拟环境就相当于一个虚拟的Python,它包含的模块没有那么完整(比较少),这样就不会打包不必要的模块
虚拟环境pip安装Pyinstaller模块,同上
【注意:虚拟环境创建后,以后都可以用,不用再重新创建,Pyinstaller模块pip安装后也是】
同样的操作,打包后的文件大小能缩小(在一般Python程序的打包中不是很明显,对于GUI界面化程序十分明显)
【升级版步骤03】
【说明:这一步不是必要的】
【打包的程序我们是可以改它的图标的,它默认的图标是】
【更改方式(在创建时才能更改)】
Pyinstaller -F -w -i ico图标文件名 Python文件名
pyinstaller guide
2. 打包多文件目录
2.1打包单个文件
1.执行命令
pyinstaller -F xxx.py
2.去生成的dist文件夹找xxx.exe运行
3.运行成功,xxx.exe则为可执行文件,删除其它文件
2.2打包多个文件
1.执行命令,xxx.py为程序入口文件
pyinstaller -D xxx.py
2.删除生成的bulid和dist文件夹,仅保留xxx.spec文件
3.修改xxx.spec文件,详见2.2.1
4.执行命令
pyinstaller -F xxx.spec # 报错就运行 pyinstaller xxx.spec
5.去dist文件夹下找xxx.exe文件
6.运行成功,删除临时文件目录build;dist目录为打包的结果,可执行文件和其它程序运行的关联文件都在这个目录下
2.2.1 xxx.spec配置文件详解
-*- mode: python -*-
block_cipher = None
# 以py文件为输入,分析py文件的依赖模块,并生成相应的信息
a = Analysis(['xxx.py'], # 要打包.py文件名列表,和xxx.py同级可以不同添加
pathex=['D:\\abc\\def\\project_v1.0'], # 项目路径
binaries=[], # 程序调用外部pyd、dll文件(二进制文件路径)以数组形式传入;例:('D:\\pro\\text.dll', 'pro'),将'pdftotext.dll'pro,与原项目结构一致即可
datas=[], # 存放的资源文件(图片、文本等静态文件)以数组形成传入;例:('D:\\static\\c.ioc','static'),将'cc.ioc'打包之后放在static目录,与原项目结构一致即可
hiddenimports=[], # pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx;这时就需要在hiddenimports中加入遗漏的模块
hookspath=[],
runtime_hooks=[],
excludes=[], # 去除不必要的模块import,写在excludes中添加此模块
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
# .pyz的压缩包,包含程序运行需要的所有依赖
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
# 根据Analysis和PYZ生成单个exe程序所需要的属性及其配置
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='xxx', # 生成exe文件的名字
debug=False, # debug模式
strip=False,
upx=True,
console=False, # 是否在打开exe文件时打开cmd命令框
icon='C:\Users\xx.ico' ) # 设置exe程序图标,ico格式文件(16*16)
# 收集前三个部分的内容进行整合,生成程序所需要的依赖包,及资源文件和配置
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='fastplot')
1
踩坑
编辑.spec文件路径相关
1.windows尽量使用绝对路径,用双斜杠\ \
2.linux路径/home/my_project/web
3..路径避免使用中文
打包.spec文件报错:RecursionError: maximum recursion depth exceeded
1.在spec文件上添加递归深度的设置
import sys
sys.setrecursionlimit(5000)
更换exe图标报错:AttributeError: module ‘win32ctypes.pywin32.win32api’ has no attribute ‘error’
1.图标的大小建议(64*64): https://lvwenhan.com/convertico/
2.图标的颜色严格限制:256,真彩色是不行的
打包错误:ModuleNotFoundError: No module named ‘xxxxx’
方法1:pyinstaller -D --hidden-import="xxxxx" main.py
方法2:在xxx.spec中配置hiddenimports=['xxxxx']
运行exe文件报错:Failed to excute Script main
1.使用-c模式重新打包调试,找的缺失的模块,pip install安装
文件打包后过大
1.在程序中尽量不使用import xx;而是使用 from xx import xx
OSError: [WinError 126] 找不到指定的模块。 Error loading “D:\dist\dist\main\torch\lib\shm.dll” or one of its dependencies.
大部分的问题还是缺少了依赖的包,用dependency找到这个包的相关依赖包全部导入即可
问题描述:按目录打包流程走完后,部署到其他电脑上时出现如下报错。
查看提示,打包的文件中缺少了shm.dll/它的依赖文件
查看dist目录对应目录下有这个文件,所以是依赖出了问题,要查看相关依赖,可以百度下载dependency工具(50m左右,很小)。
下载地址:http://www.dependencywalker.com
下载完成之后直接把shm.dll拖拽进去页面,会自动显示它相关的依赖。
点击-号目录会自动进行收缩,鼠标先左键点击其中一个依赖,再右键会出现full path选项,点击即可出现依赖的全部路径,如下图
然后跟随对应的依赖路径,挨个去对应的路径下,找到这个依赖,然后copy进项目的主目录,如下
上图均为手动复制粘贴进去,然后在xxx.spec中填写配置文件
这时候把shm.dll对应的依赖的路径,和copy到主目录的数据,按上图方式写进spec文件中
然后命令行对应文件夹下输入pyinstaller xxx.spec
右键运行最后在dist文件中找到xxx.main,命令行打开可以运行,部署到其他电脑时顺利运行
更多推荐
所有评论(0)