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

前言

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

目录

    • 前言
  • 一. 打包.exe文件方法简介
  • 二. 究极解决方法
    • 1. 打包资源文件夹
    • 2. 修改.py文件
    • 3. 生成.spec文件并修改
    • 4. 生成.exe文件以及其他相关文件
  • 参考资料

未经允许,禁止转载。

一. 打包.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文件_第1张图片

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文件_第2张图片
修改前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)