欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python:pyinstaller如何将一个项目的.py和相关资源文件打包生成.exe文件

程序员文章站 2022-03-30 22:55:27
...

前言

写这篇博文真属于意外,因为小编不是以学术为目的的,而仅仅是以讨女朋友喜欢为目的,所以文中略有狗粮。撇开这些,相信大家找到为了找到一个可行方案已经寻寻觅觅良久,本文或许便是你的“真命天子”。Python生成.exe的方法有很多,本文仅介绍pyinstaller。文本的解决思路便是:.exe文件在执行时会生成一个临时文件夹,而我们需要做的就是把我们的资源文件放入临时文件夹,让程序访问。本文使用的是Windows系统,其他系统以实际情况为转移。

一. 打包.exe文件方法简介

Python打包.exe的方法大致有四种:py2exe, pyinstaller,cx_Freeze和nuitka。其中最常用的是pyinstaller。Pyinstaller本身不是python库,但依旧可以安装python库安装方式安装,生成的.exe可以跨多平台使用,也能指定图标。

生成.exe的一个弊端是文件太大,强烈建议使用from xxx import xxx 语法而不是import xxx,因为这样.py文件只需导入库文件的一部分,可以降低.exe文件大小。

二. 究极解决方法

前言中讲到要利用.exe文件的临时文件打包资源文件,那现在怎么做呢?

1. 打包资源文件夹

我们需要把使用到的资源文件都放在一个文件夹里。本文在当前目录下新建了一个名为res的子文件夹来存放资源文件,本文假设res内的资源文件为ConfessionBallon.MP3
Python:pyinstaller如何将一个项目的.py和相关资源文件打包生成.exe文件

2. 修改.py文件

我们需要在读取资源文件的地方调整我们的代码,加入下面的代码:

#coding:utf-8
import sys
import os

#生成资源文件目录访问路径
def resource_path(relative_path):
    if getattr(sys, 'frozen', False): #是否Bundle Resource
        base_path = sys._MEIPASS
    else:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

#访问res文件夹下ConfessionBallon.MP3的内容
filepath = resource_path(os.path.join("res","ConfessionBallon.MP3"))

然后,修改其他地方,所有获取资源文件路径的方式皆如上所示。本文中便是使用filepath访问ConfessionBallon.MP3。

3. 生成.spec文件并修改

修改完.py文件后可以先运行一下,保证无误。然后通过cmd指令:

pyi-makespec -F beloved.py

生成.spec文件。如果要添加Icon等可以在这里就使用pyi-makespec --icon abc.jpg -F beloved.py语句生成spec文件。
接下来,修改.spec文件:
Python:pyinstaller如何将一个项目的.py和相关资源文件打包生成.exe文件
修改前datas=[],本文这里把它改成上图所示,意思是

将beloved.py当前目录下的res目录(及其目录中的文件)加入目标exe中,在运行时放在零时文件的根目录下,名称为res。

到这一步便可以把资源文件嵌入到.exe文件了。

4. 生成.exe文件以及其他相关文件

接下来,我们便可以放心的生成.exe文件了。执行cmd指令:

pyinstaller -F beloved.spec

.exe文件生成在子文件dict中。到此便可以把.exe发给其他电脑端运行了。.exe运行比较慢,建议多等待,只要没出现错误提示就OK。

可能会出现No module named 'pkg_resources.py2_warn’错误提示,详情参见解决方案

本文代码和运行效果图由于比较私密,便不与大家分享了。希望本文能对大家有用。

参考资料

  1. 王张飞,Pyinstaller生成exe文件(详细教程),https://blog.csdn.net/RNG_uzi_/article/details/92986876,CSDN。
  2. 浪子燕青啦啦啦,Python打包exe文件方法汇总【4种】,https://blog.csdn.net/lzy98/article/details/83246281,CSDN。
  3. super_小黄,Python导出exe打包之吐血总结,https://www.jianshu.com/p/c029574187d2,简书。
  4. darcymei,Pyinstaller如何将资源文件一起打包至exe中,https://www.cnblogs.com/darcymei/p/9397173.html,博客园。
  5. fred110119,pyinstaller 打包exe运行错误 No module named ‘pkg_resources.py2_warn’,https://blog.csdn.net/fred110119/article/details/104667749,CSDN。
相关标签: python exe