Python 程式打包為執行檔.exe ( Mac OS )

陳明佐
我就問一句,怎麼寫?
5 min readDec 16, 2019

嗨,大家好,打給後,胎嘎後。

今天要來跟各位分享,如何將寫好的Python程式碼,打包成一個執行檔,並執行於不同的OS或環境。

首先你需要幾個套件,這邊列出我當初打包程式所使用到的套件

  1. Python ( 這是廢話,我的版本是 Python 3.7 )
  2. Pyinstaller
  3. Pipreqs
  4. 最後這個比較特別,是 Docker

若讀者不懂Docker是何物,麻煩請移駕至Google進行查詢。

我個人也對Docker沒有很深入的理解,所以不便在此多做解釋跟說明。

但這邊跟各位說明,為何要使用到Docker。

首先我們必須透過Docker載入一套件Image,輔助我們將程式打包。

這邊做的事呢,是為了讓在Mac撰寫編譯後所打包的執行檔,可以在Windows OS上執行。原因後續會稍微解釋。

程式撰寫完成,在Mac OS打包成「Unix執行檔」

這邊就是剛剛上述的,因為作業系統的差異,所以如果直接透過套件 “Pyinstaller“ 所打包成的執行檔,僅能在「相同作業系統」不同環境下執行

舉個例:假設您撰寫python code是在Mac上使用Jupyter,然而你的程式要交由一個沒有程式背景的朋友執行(他的電腦並沒有安裝任何python相關套件),這時候使用pyinstaller就可以達成目的。( 因為Mac OS打包完成的執行檔為Unix檔,無法正確地在Windows OS使用)

會顯示類似以下錯報:

與您執行的 windows 版本不相容。請檢查電腦的系統資訊,然後 連絡軟體發行者。

至於說Pyinstaller如何使用、細節功能
這邊提供一個連結給大家參考:

我個人都是直接Terminal使用以下功能:

Pyinstaller -F your_python_code.py

“ -F ” 的功能為將所有檔案打包成為一個執行檔(其他哩哩扣扣麻煩自己查XD)

完成之後大概出現像這樣的幾個文件跟資料夾

生成文件及資料夾,其中.spec檔之黨名為原python code之檔名
dist資料夾裡面生成的為Unix執行檔

透過Docker Image 幫助我們使用跨平台打包程式

為了跨平台使用,我們需要借助網路上寫好的Open Source :

這邊跟各位介紹流程:

  1. 先到上面的github連結下載zip file並解壓縮
  2. 在 docker-pyinstaller-master folder中建立一個名為 “ src “ 的資料夾
  3. 將剛剛透過pyinstaller所生成的 xxxxx.spec 丟進到 src 資料夾裡面
  4. 再把你原始的 xxxxx.py 程式碼 也丟進 src 資料夾
  5. 此步驟需要另一套件 pipreqs , 透過 pip install pipreqs 下載安裝套件
  6. 在Terminal指定到 src 路徑底下並執行 pipreqs ./
  7. 此時會生成一個 requirements.txt 內容如下
此為 原python檔所引用import的套件清單

這邊生成requirements文件檔是為了打包軟件能import正確的Lib打包成為exe執行檔。

8. 到此步驟,我們應該會擁有三個檔案在 src 資料夾裡: xxxxx.py, xxxxx.spec, requirements.txt;之後我們可以使用剛剛開頭提到的github載下來的Docker Image,來把我的程式打包成.exe執行檔。

9. 在Terminal下 docker run -v "$(pwd):/src/" cdrx/pyinstaller-windows
之後docker就會啟動寫好的服務,透過我們給予的requirements套件,將Library庫的資源打包至我們寫好的程式,生成一個可以在Windows執行的.exe檔。

相反地,如果想要在Windows建立一個可以在Linux/MacOS運行的Unix執行檔,就是下另一條指令來生成:

docker run -v "$(pwd):/src/" cdrx/pyinstaller-linux

此外,這邊可能會遇到一個問題,形成類似下面出現的錯報:

OSError: [WinError 123] Invalid name: ‘/tmp\\*’

網路上提供的解決辦法是,將Terminal當下指定的路徑,移動至src資料夾裡

再執行上面的Docker command。

最後打包的成果如下圖所示, ex : stakeholder_check.exe

以上,就大功告成,可以順利地在完全沒有 “ python “環境的Windows OS

執行你在MacOS撰寫的python code。

--

--