使用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目錄中的文件了

如果有其他問題可以留言討論

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容