之前一直困扰,无法将静态文本文件和python文件打包到一起,最近试下来发现这种打包方式是可以解决这个问题的
假设你的项目结构如下:
my_project/
│
├── main.py # 主 Python 代码
├── templates/ # Jinja2 模板目录
│ ├── index.html
│ └── about.html
- 你可以通过以下命令打包项目,同时把 templates/ 文件夹打包进 exe 文件,并且打包之后是只有单个exe文件生成的:
pyinstaller --onefile --add-data "templates/*.html;templates" main.py
--onefile 选项表示生成单个 exe 文件
--add-data "templates/*.html;templates" 表示将 templates 目录下的所有 .html 文件打包进 exe, 打包后的文件仍位于 templates 目录中,也就是说在打包之后的文件内部,我们完全可以放心的用和python代码相同的相对路径去使用这些静态文件
- 当然代码还需要获取一下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目录中的文件了
如果有其他问题可以留言讨论