之前一直困擾,無法將靜態文本文件和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目錄中的文件了
如果有其他問題可以留言討論