技術筆記-產品化重要進程,打包執行檔

更新於 發佈於 閱讀時間約 8 分鐘

自從去年底 (2024/11) 開始用 python 開發 gui 程式,寫啊寫功能越來越豐富了,已經有一些很好用的亮點,可不可以把它打包成單一執行檔呢?這樣可以拿去服務其他的使用者,成為可向外推廣的產品,真是很棒的想法。稍微研究一下 PyInstaller 的用法,功能很強大,目前想到的產品化需求,全部可以辦到。

平時用開發環境在執行程式,因為環境會一直變動,開發越久就越肥大,久而久之就忘了如何從無到有,用最小必要條件來執行,需要來回想歸納一下,讓程式成功執行所需要的流程和條件:

  1. 安裝 python 執行環境,並安裝程式有用到的相依套件。
  2. 大部分的套件是在雲端託管平台,只要 pip install 就可以安裝了;但也有少部分,如富邦證券提供的 sdk,是一個 whl 檔,分不同的 os 平台。開發階段在本地安裝當然沒問題,但若要作為「網站後台」部署到雲端伺服器,則 requirements.txt 必須有這一行「--find-links wheels」,意思是到 wheels 目錄尋找安裝檔,而安裝檔必須在佈署時一併上傳。而本次打包需求為 gui application 則無這層顧慮,PyIntaller 會自動把所有用到的套件都納入,也不需要 requirements.txt,此功能令人激賞。
  3. 資源檔們。就是程式執行會用到的靜態檔案。如本系統用到 google firestore 文件資料庫和 google storage 檔案庫,兩者都需要讀取一個 serviceAccountKey.json 靜態檔,作爲帳戶識別和認證。此帳號相關資訊和金鑰,與使用者無關,屬於系統底層的重要參數。這種資源檔,若開發時很隨意的放在程式所在目錄,或本地特定寫死的目錄,打包程式是不會知道的,因此必須特別處理。我的作法是在專案中開立一個目錄 resource 存放所有資源檔,打包時加入「--add-data "resource:resource"」告訴 PyInstaller 要包含 resource 裡所有的檔案。語法中 mac and windows 稍有不同,windows 需要用分號「--add-data "resource;resource"」,意思是從 resource 目錄打包檔案,當使用者執行時,再把它解壓縮放置於 resource 目標目錄。依照這樣的設計,當程式要取用時就不可 hard code 靜態路徑,而是要判斷是開發環境還是分發後的環境,再動態指定路徑,所以一個小小的公用程式是必須的:
    def resource_path(filename: str) -> str:
    try:
    # PyInstaller 打包後會設置 _MEIPASS
    base_path = sys._MEIPASS
    except AttributeError:
    base_path = os.path.abspath(".")

    return os.path.join(base_path, "resource", filename)
  4. 使用者需要自定義的檔案們。包含使用者自己的帳號密碼,也許存在某個 ini 檔或是 python 所慣用的 .env 隱藏檔,還有存取券商帳號最重要的「憑證檔」,還有我,作為開發廠商,為了管理使用權限的「授權檔」,通常是加密過後文字檔,這些通通都「不能」打包進入安裝包。不然取得安裝包的人,也許就存取到別人的資料,或是變成永久免費使用,那問題就嚴重了,安全是無可妥協的。這類檔案,在開發階段我選擇放置在專案根目錄,而分發階段就由使用者自行放置在執行檔所在目錄。所以再寫一段小程式判斷開發階段或分發階段,與前述取得 resource 位置,方法類似,異曲同工:
    def get_project_root():
    if getattr(sys, 'frozen', False):
    return os.path.dirname(sys.executable)
    else:
    return os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))

以上第 3. 4. 點,非常關鍵,打包這種事在開發工作中屬於較稀有的事件,每次要做每次忘記,這次這樣整理,簡單明瞭。將來必須養成好習慣,絕對不要「寫死路徑」,以免要打包時,又要修改一堆程式。

以上已經萬事俱備,可以來執行打包了,把指令寫成可重複使用的 .sh 或是 .bat 是合理的做法:

-------------------mac------------
#!/bin/bash
echo "🔧 開始打包..."

# 清除舊的 build
rm -rf dist build

# 打包 main.py,包含 resource 資料夾
pyinstaller main.py \
--add-data "resource:resource" \
--noconfirm \
--icon=nm.ico \
--clean \
--onefile \
--name "RiskManager"

echo "✅ 打包完成!請查看 dist/RiskManager"

-----------windows----------------------
@echo off
echo 🔧 打包開始...

REM 建立一個乾淨的打包環境
rmdir /s /q dist
rmdir /s /q build

REM 使用 PyInstaller 打包 main.py,包含 resource 資料夾
pyinstaller main.py ^
--add-data "resource;resource" ^
--noconfirm ^
--icon=nm.ico ^
--clean ^
--onefile ^
--name "RiskManager"

echo ✅ 打包完成!請查看 dist\RiskManager.exe
pause

從僅僅只是自己用的開心,走向產品化道路,這是艱難的過程。技術面主要的關卡有使用者認證,授權管理,和本文所提的佈署分發問題。Web 和 Application 各有不同的技術考量,我目前的題目牽涉到存取個人金融帳戶的敏感資料,用 Application 可以將個人帳密和憑證都保留在本地,可能是比較好的切入點,後續在設計好安全機制之後,也會開發 Web 版的功能。

此外關於產品定位,是更難的問題。可以自行獨立開發是幸福的事,總是發散式的多方嘗試,但產品則需要明確定義目標用戶,和所需強調的亮點,所能解決的痛點。經過一番取捨,終於把安裝檔瘦身到 60 幾 Mega,另外製作產品說明文件如下:

這次要玩真的了。

Newman 2025/8/7

導覽頁:紐曼的技術筆記-索引







留言
avatar-img
留言分享你的想法!
avatar-img
newman的沙龍
25會員
129內容數
漫步是一種境界。
newman的沙龍的其他內容
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/04/01
Reinforcement Learning (強化學習) 的理論非常有趣,可能是因為其中許多方法,與人類的學習歷程極為相似,如試錯,獎懲,改進策略,持續優化等等。現在準備來爬這座山了,我把學習階段大致分成三個小山峰,依序為 Q-Learning --> DQN --> Actor-Critic,
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2025/03/08
稍微看一下 Telegram 官方文件,哇!好強喔,功能說明的第一項赫然出現「可以取代整個網站」!口氣真的很大。雖然我的需求應該很低,但能夠確認前面是一座豐富的寶藏,還是很令人興奮的,待基本功能掌握之後,可以再評估和決定要不要往下挖。 發送訊息 要達成這第一個目標,首先必須建立一個 bot。
Thumbnail
2025/03/01
Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告
Thumbnail
2025/03/01
Line Notify 即將停止服務,隨著時間越來越緊迫,隱約聽到許多人在哀嚎。印象中有許多廠商,把 Line Notify 用得淋漓盡致,甚至可以一個客戶建一個群組,把許多客製化服務都用程式管理的井井有條,得到很好的滿意度。但這種好康,無限免費的即時訊息,沒有了,時間就在 2025/3/31!公告
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
Thumbnail
在離線環境需要安裝Python套件時就相當的麻煩,需要先下載好套件包,在打指令安裝,若套件數量一多時就會相當麻煩。 本文將介紹如何利用兩行指令快速的安裝整個資料夾的套件。
Thumbnail
介紹如何用assign函數在Python中建立新欄位
Thumbnail
介紹如何用assign函數在Python中建立新欄位
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
什麼是Python python是電腦程式語言的一種,如同python官方網站上的介紹 "Python是一種程式語,可讓你更快速地工作並更有效的整合系統"。簡單地說,就是你可用python這個程式語言去告訴電腦你想要作什麼,讓電腦來幫你完成你要作的事情。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
Python是一種易學且功能強大的程式語言,具有直譯、動態語法等特性,並擁有豐富的標準庫。它在各領域如Web開發、數據科學和人工智慧等得到廣泛應用,並被許多大公司如Google和Facebook等使用。Python還有強大的框架、豐富的交互機能、和龐大的社區。
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
在Python中,import是一個關鍵字,用於將其他模組或套件中的程式碼引入到當前的程式中以供使用。 這個關鍵字允許你在你的程式中使用其他地方定義的變數、函式和類等。 當你使用import時,Python會搜索指定模組或套件的位置,並將其中的程式碼載入到你的程式中,這樣你就可以在程式中使用它們
Thumbnail
情況描述 我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課(pip install…)」有提到如何打包Python讓自己的程式變成套件, 讓其他人可以用pip install的方式進行安裝,😲 But… 我們實際上打包後, 發現到引用的檔案都有被打包進去,但目錄卻未被打包
Thumbnail
情況描述 我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課(pip install…)」有提到如何打包Python讓自己的程式變成套件, 讓其他人可以用pip install的方式進行安裝,😲 But… 我們實際上打包後, 發現到引用的檔案都有被打包進去,但目錄卻未被打包
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
Thumbnail
設計程式來讀取欲傳送訊息之參數txt檔案,再利用程式自動傳出訊息至LINE群組。能簡易使用於任何場合。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News