打包python代码为exe文件
文章目录
概要
使用流程
常见问题
概要
主要介绍Pyinstaller的基本使用方法,以及使用Pyinstaller打包py文件为exe的要点有:
1)文件路径
2)命令参数
使用流程
所有操作均在终端中进行。
1)先下载包(下载失败就换源下载)
pip install pyinstaller
pip install pyinstaller -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
2)使用基本命令
pyinstaller -F -w --add-data "SOURCE;DEST" xxx.py
注意:
- 使用该命令前,必须进入到该py文件的当前目录下
常用参数介绍:
- -F 表示生成单个可执行文件,最终目录下只有一个exe文件;如果不使用该参数会将其他资源也展现出来
- -w 表示去掉控制台窗口,在调试过程中可以先不使用方便查看报错
- -i 表示可执行文件的图标,可以设置打包完成后的图标,
使用样例:pyinstaller -F -i ./xxx.ico xxx.py- --add -data 表示添加资源文件到exe文件中,参数接受 SOURCE:DEST 或SOURCE;DEST 格式,SOURCE 是你本地的资源路径,DEST是打包后资源文件的目标路径。在windows和mac系统下使用";"隔开文件,在 Linux/macOS 上使用 : 作为分隔符。
想打包多个文件:pyinstaller -F --add-data "SOURCE;DEST" --add-data "SOURCE1/xxx.txt;DEST1" xxx.py
这里可以指定打包SOURCE1文件夹下的特定文件,也可以直接打包SOURCE下的所有文件;目前就我使用情况来看只能添加和py文件在同一级的文件夹。
3)运行之后,会产生两个文件夹和一个文件:build文件夹,dist文件夹(exe文件就在这里),最后一个是.spec文件(可以编辑该文件然后对它进行打包)
使用这种方法可以参考这篇博客。
常见问题
(1)路径问题最难办,因为很有py文件在开发模式下大部分都是采用abspath/realpath的方法获取路径
root_dir = os.path.dirname(os.path.abspath(__file__))
开发模式下,获取的路径为当前py文件工作的路径。
打包为exe文件时,获取的路径则是资源缓存的路径,因为在运行exe文件时,系统会将它解压在C:\Users\86176\AppData\Local\Temp\xxx某临时文件夹下,所以这里最后获取资源的路径会产生错误。
解决方法:
1)使用--add -data,打包资源文件到exe文件中时,可以使用下文的函数,来获取不同情况下的路径。
- 在开发模式下:你可以通过
os.path
获取资源文件的路径(例如os.path.join
)。 - 在
.exe
打包后:你需要通过sys._MEIPASS
来处理资源文件路径。
sys._MEIPASS 是一个由 PyInstaller 设置的特殊属性,它的值是程序运行时创建的临时目录的绝对路径。
def resource_path(relative_path):
# 判断运行状态是开发模式还是exe打包状态
if getattr(sys, 'frozen', False):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
folder_path = resource_path('your_folder')
2)不使用--add -data打包资源,而是将资源放在dist文件夹下,可以使用sys.executable:
path = os.path.dirname(os.path.realpath(sys.executable))
具体路径根据需要修改
- sys.executable 返回当前 Python 解释器的路径(即正在运行的 Python 解释器的可执行文件路径)。
- 如果是用 pyinstaller 打包后的 .exe 文件,sys.executable 会返回 .exe 文件的路径
(2)打开exe文件如果报错会直接退出程序,如何查看bug
打开cmd,直接将exe文件拖进去,回车运行就可以看到报错了