【PyQt5】Day 3 – 用 pyinstaller 將 python 程式打包,把每天的成果分享給你的親朋好友

➣ Reading Time: 5 minutes

看完這篇文章你會得到的成果圖

因為 PyQt5 要學的東西太多,
我們先來學打包 python 好了,(逃避要學東西太多的現實)
這樣就可以把每天的學習成果分享給親朋好友囉!

打包的重點就在於,我們只要打包後,這個程式會變成單一執行檔,
而且可以橫跨「windows, mac, ubuntu」的「同作業系統電腦」使用,
還不用特別安裝「python」也能執行哦!
(想想你之前下載遊戲的時候,有特別還要去安裝什麼程式語言嗎XD)

  • 更新:這邊我一開始有點誤會了,打包後的程式是在「同OS上能夠直接執行,不能夠跨作業系統」。
    也就是說如果是同樣 windows 的電腦,我包好之後可以直接給另外一台 windows 的電腦使用,
    mac 電腦對 mac 電腦也是,以此類推。

  • 至於「跨作業系統」自然是不行的,會需要至少一台該作業系統的電腦重包
    (可以想像一般我們安裝軟體的時候,都會有很多作業系統的版本要你選,因為不同作業系統運作程式的邏輯不同,需要依照該作業系統的運作邏輯將程式打包起來。)

安裝 pyinstaller

老樣子的一行解決 (我想大家應該也都很習慣了(吧)…?)

pip install pyinstaller

補充 – anaconda 安裝 pyinstaller 的方法 (感謝網友:steven yang 補充)

如果使用 pip 安裝 pyinstaller 會出現以下問題:

無法辨識’pyinstaller’ 詞彙是否為Cmdlet、函數、指令檔或可執行程式的名稱) 的報錯。

這時如果有搭配 anaconda 的環境使用,可以採取在 anaconda terminal 輸入的以下方法:

conda install -c conda-forge pyinstaller

有些東西在 anaconda 上用 pip 會不能運作… ( <- 我自己也踩過很多次這個坑XDD )
感謝網友:steven yang 幫忙補充 ^ ^

來打包昨天的程式碼吧!

昨天我們完成的 UI.py,
我們可以直接在終端機輸入

pyinstaller -F UI.py

結果

打包的過程,會稍微需要等一下,
中途會跳出一堆東西,可以順便看看有沒有錯誤。

最後等待程式跑完後,我們去同一個資料夾底下的 dist,裡面會看到一份「UI.exe」 。

我們打開來試試看吧!

看起來就跟昨天的結果一模一樣呢!!!
(請忽略上面的顏色XD,只是心情好剛好去改 windows 配色,那顏色不是用 Qt 做的XD)

小結

這份「UI.exe」我們就可以拿來分享給全世界你的親朋好友囉!
只要是有「同作業系統 (windows, mac, ubuntu)」的電腦,不用特別安裝環境應該都能夠打開!

Reference

⭐Python PyQt5 相關文章整理⭐:
⭐基礎知識與架構篇⭐:
1.【PyQt5】Day 1 – 安裝 PyQt,建立自己的第一支 PyQt5 程式
2.【PyQt5】Day 2 – 利用 Qt designer 建立第一支有自己介面的 PyQt5 程式
3.【PyQt5】Day 4 – 重要的 Qt 程式邏輯觀念,務必先有此觀念後面才會懂自己在幹嘛
4.【PyQt5】Day 5 – 開始來設計我們的 controller.py,改以「程式角度」來說明如何建立 PyQt 的系統
⭐基本元件應用篇⭐:
1.【PyQt5】Day 6 – 我們的第一個 output 手段 – Qlabel
2.【PyQt5】Day 7 – 我們的第一個 input 手段 – QPushButton
3.【PyQt5】Day 8 – 我們的第二個 input 手段 – QLineEdit
4.【PyQt5】Day 9 – 以 QLineEdit, QTextEdit, QPlainTextEdit 作為文字的輸入
6.【PyQt5】Day 14 - 使用 QSlider 製作可拖曳的滑條
8.【PyQt5】Day 19 - 使用 QProgressBar,製作進度條的功能
⭐介面系統控制篇⭐:
5.【PyQt5】Day 10 – 以 QFileDialog 讀取系統的檔案、資料夾
7.【PyQt5】Day 18 / Project 使用 QTimer,自製碼表(計時器) PyQt5 stopwatch DIY
1.【PyQt5】Day 20 - PyQt 最重要的 QThread 概念 / 為什麼 windows, mac, ubuntu (linux) 程式會「沒有回應」?
2.【PyQt5】Day 21 – 透過 PyQt 實現滑鼠監聽總整理,完全掌握滑鼠控制 (listen mouse)
3.【PyQt5】Day 22 – PyQt 視窗的個性化/屬性控制 setWindowFlags,禁止放大縮小、永遠顯示於最上層/最下層
4.【PyQt5】Day 23 – 使用系統內建的調色盤 QColorDialog,來替我們選擇顏色 QColor (Color Picker)
5.【PyQt5】Day 24 / Project 偵測滑鼠目前指示顏色的小工具 (滴管工具), 利用 QCursor 偵測滑鼠, QApplication 取得截圖
⭐影像處理篇⭐:
1.【PyQt5】Day 11 – 以 Qlabel 在 PyQt 中顯示圖片 (基於 QImage 使用 OpenCV)
2.【PyQt5】Day 12 – 建立一個可以縮放圖片大小的顯示器 (基於 QImage 使用 OpenCV)
3.【PyQt5】Day 13 – 使用 QVBoxLayout, QscrollArea 製作出捲軸,以高解析度檢視圖片 (基於 QImage 使用 OpenCV)
4.【PyQt5】Day 15 / Project 與檔案功能整合,製作出可讀取圖片並可縮放的 UI 介面 (使用 PyQt + OpenCV)
5.【PyQt5】Day 16 - 在 PyQt5 中取得圖片座標 (滑鼠位置) mousePressEvent,觀察圖片在 Qt 中產生的方式,對原圖進行座標換算處理
6.【PyQt5】Day 17 / Project 製作標註 roi 工具, 開始導入 OpenCV 作為繪圖引擎, 在圖上畫點並顯示座標
⭐project 篇⭐:
1.【PyQt5】Day 25 / Project 自己做一個影片播放器 DIY video player (結合 PyQt + OpenCV)
2.【PyQt5】Day 26 / Project 替我們影片播放器增加一個顯示進度的滑條 video player add slider (與昨日 bottleneck 處理細節)
3.【PyQt5】Day 27 / Project 製作影片 ROI 標註工具 (PyQt 結合 OpenCV 在圖上畫點畫線)
4.【PyQt5】Day 28 / final project – 1 來搞一個自己的 photoshop 吧!UI 篇 + 純程式架構篇 (結合 PyQt + OpenCV)
5.【PyQt5】Day 29 / final project – 2 來搞一個自己的 photoshop 吧!後段程式細節篇 (結合 PyQt + OpenCV)
6.【PyQt5】Day 30 / final project – 3 來搞一個自己的 photoshop 吧!把每個方法封裝起來製作出還原功能吧! (結合 PyQt + OpenCV)
⭐打包程式篇⭐:
1.【PyQt5】Day 3 – 用 pyinstaller 將 python 程式打包,把每天的成果分享給你的親朋好友
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps
Howard Weng
Howard Weng

我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!

文章: 728

11 則留言

  1. [主旨: 利用anaconda安裝pyinstaller的改善意見]
    版主您好,
    首先,很開心能在這個網站看到這麼有脈絡的PyQt教學!!

    在Day3那邊,用pip安裝pyinstaller的時候
    會有: (無法辨識’pyinstaller’ 詞彙是否為Cmdlet、函數、指令檔或可執行程式的名稱) 的報錯。

    後來發現,在anaconda prompt的終端機上輸入:
    conda install -c conda-forge pyinstaller
    應該就沒有問題了(有些東西在anaconda上用pip會不能運作)

    以上提供方法給之後的讀者參考,希望能避免這個坑><

    • Hi steven yang,
      有這樣的留言對我來說是最大的鼓勵!!
      感謝你的建議哈哈哈哈,我把他補充進文章裡面了!

      (有些東西在anaconda上用pip會不能運作) <- 這坑我也踩了不少次,有些踩到的當下沒記錄下解法XDD 後續又碰到真的是很煩XDD

    • 基本上就看不到了,跟你說的一樣XD
      至少不會是赤裸裸的程式碼大家都看得到。
      ——
      但通常加密這種事情都是防君子不防小人,
      如果有人真的想要破解,反破解、反反破解、反反反破解… 什麼招數都有,就真的沒完沒了了XD

  2. 版主好~
    感謝文章分享PyQt的學習
    想請教用pyinstaller打包時,是只要打包start.py嗎?
    另外打包出來檔案超大(300多MB) 是可能哪邊有問題 XD
    再麻煩指點一下方向
    謝謝

    • 打包雖然指定的是一個檔案 但會把後面的元件也都包進去哦
      (類似我只告訴他入口,但他會把迷宮裡面的東西都走過一遍)

      至於檔案該有多大,因為我也不太清楚你把專案寫得多大XD 所以這我很難回答
      但有個方向是不要忽略 import XXX 所佔的空間,
      因為這行背後就是把好幾份 .py 的檔案都讀進來使用~

      • 版主大大好
        卡了2天終於解決問題啦 XD
        最後打包成73MB,成功瘦身~
        (雖然還是有點大,可能使用不少套件的關係)

        關鍵點應該是之前pyinstaller把anaconda的一些套件也打包進去所以很肥大
        後來用pipenv+upx處理

        又學了不少東西
        感謝版主指點方向 XD

          • 我一開始是先嘗試只改扣只import需要的function
            但是打包完還是很巨大

            改用虛擬環境之後才縮小許多
            之後有空再來驗證是不是有anaconda的環境打包都會size很大 XDD

            版主的網站做得很不錯喔,是用wordpress嗎?

            • 原來如此! 感謝~~
              是用 wp 沒錯,不過會選擇的原因主要是前端懶得慢慢寫XD
              再加上自己不算是前端起家,所以套框架後再小改程式碼挺方便的~
              (還有一些開源的外掛很好用~~)

★留個言吧!內容有誤或想要補充也歡迎與我討論!