首頁 >後端開發 >Python教學 >如何使用 PyInstaller 的 --onefile 選項成功捆綁資料檔?

如何使用 PyInstaller 的 --onefile 選項成功捆綁資料檔?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-23 03:24:131000瀏覽

How Can I Successfully Bundle Data Files with PyInstaller's --onefile Option?

使用PyInstaller 捆綁資料檔:解決--onefile 問題

PyInstaller 是一個用於從Python 腳本創建獨立可執行檔的強大工具。使用 PyInstaller 的 --onefile 選項來捆綁資料檔案(例如圖像或圖示)時,如果找不到引用的文件,使用者可能會遇到挑戰。

了解 --onefile 功能

--onefile 選項將所有程式檔案、庫和資料合併到一個執行檔中。這對於分發和安全目的可能有益,但需要修改資料檔案的存取方式。

處理資料檔案

最初,規範檔案包含以下程式碼指定資料檔案:

a.datas += [('images/icon.ico', 'D:\[workspace]\App\src\images\icon.ico', 'DATA'),
('images/loaderani.gif','D:\[workspace]\App\src\images\loaderani.gif','DATA')]

但是,使用--onefile,PyInstaller 不再將資料檔案儲存在特定目錄中。相反,它將它們嵌入到可執行檔本身。

解決檔案查找問題

要解決已編譯的EXE 無法找到資料檔案的問題,這是一種已知的解決方法正如Shish 所建議的,涉及使用atexit 模組設定環境變數。然而,較新版本的 PyInstaller 已刪除此功能。

更新的解決方案

對於目前版本的 PyInstaller,解決方案在於透過 sys._MEIPASS 存取資料檔案。以下程式碼片段示範了這種方法:

def resource_path(relative_path):
    """ Get absolute path to resource, works for dev and for PyInstaller """
    try:
        # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

    return os.path.join(base_path, relative_path)

透過呼叫 resources_path() 取代規範檔案中的檔案路徑,可以在 --onefile 執行檔中正確定位和使用資料檔案。

以上是如何使用 PyInstaller 的 --onefile 選項成功捆綁資料檔?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn