使用pyinstaller同时打包python文件和文本文件或静态文件生成单个exe文件

之前一直困扰,无法将静态文本文件和python文件打包到一起,最近试下来发现这种打包方式是可以解决这个问题的

假设你的项目结构如下:

my_project/
│
├── main.py            # 主 Python 代码
├── templates/         # Jinja2 模板目录
│   ├── index.html
│   └── about.html
  1. 你可以通过以下命令打包项目,同时把 templates/ 文件夹打包进 exe 文件,并且打包之后是只有单个exe文件生成的:
pyinstaller --onefile --add-data "templates/*.html;templates" main.py

--onefile 选项表示生成单个 exe 文件
--add-data "templates/*.html;templates" 表示将 templates 目录下的所有 .html 文件打包进 exe, 打包后的文件仍位于 templates 目录中,也就是说在打包之后的文件内部,我们完全可以放心的用和python代码相同的相对路径去使用这些静态文件

  1. 当然代码还需要获取一下exe文件运行时的路径
    因为打包成 exe 文件后,所有文件都会被解压到临时目录中,模板的绝对路径会有所变化。因此,你需要通过 sys._MEIPASS 来获取打包后的文件路径。
import os
import sys
from jinja2 import Environment, FileSystemLoader

# 获取 exe 文件的临时目录路径
if getattr(sys, 'frozen', False):
    # 运行在打包后的 exe 中
    base_path = sys._MEIPASS
else:
    # 运行在源代码状态下
    base_path = os.path.abspath(".")

# 设置 Jinja2 模板目录路径
template_path = os.path.join(base_path, 'templates')
env = Environment(loader=FileSystemLoader(template_path))

# 加载模板
template = env.get_template('index.html')
output = template.render()
print(output)

代码调整好了之后,再运行上面打包的指令,生成的exe文件就可以完美的读取到templates目录中的文件了

如果有其他问题可以留言讨论

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容