Python 使用pyinstaller將py檔案釋出成exe程式
一. Pyinstaller簡介
Python是一個指令碼語言,被直譯器解釋執行。它的釋出方式:
-
.py檔案:對於開源專案或者原始碼沒那麼重要的,直接提供原始碼,需要使用者自行安裝Python並且安裝依賴的各種庫。(Python官方的各種安裝包就是這樣做的)
-
.pyc檔案:有些公司或個人因為機密或者各種原因,不願意原始碼被執行者看到,可以使用pyc檔案釋出,pyc檔案是Python直譯器可以識別的二進位制碼,故釋出後也是跨平臺的,需要使用者安裝相應版本的Python和依賴庫。
-
可執行檔案:對於非碼農使用者或者一些小白使用者,你讓他裝個Python同時還要折騰一堆依賴庫,那簡直是個災難。對於此類使用者,最簡單的方式就是提供一個可執行檔案,只需要把用法告訴Ta即可。比較麻煩的是需要針對不同平臺需要打包不同的可執行檔案(Windows,Linux,Mac,...)。
本文主要就是介紹最後一種方式,.py和.pyc都比較簡單,Python本身就可以搞定。將Python指令碼打包成可執行檔案有多種方式,本文重點介紹PyInstaller,
PyInstaller的原理簡介
PyInstaller其實就是把python解析器和你自己的指令碼打包成一個可執行的檔案,和編譯成真正的機器碼完全是兩回事,所以千萬不要指望成打包成一個可執行檔案會提高執行效率,相反可能會降低執行效率,好處就是在執行者的機器上不用安裝python和你的指令碼依賴的庫。在Linux作業系統下,它主要用的binutil
工具包裡面的ldd
和objdump
命令。
PyInstaller輸入你指定的的指令碼,首先分析指令碼所依賴的其他指令碼,然後去查詢,複製,把所有相關的指令碼收集起來,包括Python解析器,然後把這些檔案放在一個目錄下,或者打包進一個可執行檔案裡面。
可以直接釋出輸出的整個資料夾裡面的檔案,或者生成的可執行檔案。你只需要告訴使用者,你的應用App是自我包含的,不需要安裝其他包,或某個版本的Python,就可以直接運行了。
需要注意的是,PyInstaller打包的執行檔案,只能在和打包機器系統同樣的環境下。也就是說,不具備可移植性,若需要在不同系統上執行,就必須針對該平臺進行打包。
pyinstaller將Python指令碼打包成可執行程式,使在沒有Python環境的機器上執行
可執行在Windows,Mac和Linux作業系統下。
但它不是跨編譯的,也就是說在Windows下用PyInstaller生成的exe只能執行在Windows下,在Linux下生成的只能執行在Linux下。
二.pyinstaller在windows下的安裝
使用命令pip install pyinstaller即可
在windows下,pyinstaller需要PyWin32的支援。當用pip安裝pyinstaller時未找到PyWin32,會自動安裝pypiwin32
出現Successfully installed pyinstaller-3.1.1 pypiwin32-219即表示安裝成功
三.打包
打包的app裡並不包含任何原始碼,但將指令碼的.pyc檔案打包了。
基本語法:
pyinstaller options myscript.py
常用引數:
-F 製作獨立的可執行程式
-D 製作出的檔案存放在同一個資料夾下(預設值)
-K 包含TCL/TK(對於使用了TK的,最好加上這個選項,否則在未安裝TK的電腦上無法執行)
-w 製作視窗程式
-c 製作命令列程式(預設)
-X 製作使用UPX壓縮過的可執行程式(推薦使用這個選項,需要下載UPX包,解壓後upx.exe放在Python(非PyInstaller)安裝目錄下,下載upx308w.zip)
-o DIR 指定輸出SPEC檔案路徑(這也決定了最後輸出的exe檔案路徑)
--icon=[ICO檔案路徑] 指定程式圖示
-v [指定檔案] 指定程式版本資訊
-n [指定程式名] 指定程式名稱
可以使用 pyinstaller -h 來檢視引數說明
樣例:
將cmd的目錄切換至(命令:cd 檔案路徑(注意空格))需要打包的py檔案目錄下:
並輸入程式碼,格式為使用命令:pyinstaller -F 檔名(帶字尾py):pyinstaller -F test.py
回車後,程式碼迅速操作,直到操作結束。
返回目標檔案目錄,
打包好的exe檔案,在同目錄的dist檔案中, exe檔案已生成:
由此,py檔案打包好為exe檔案。 pyinstaller 改變生成exe程式的圖示的樣例:pyinstaller -F --icon=my.ico test.py
my.ico 是一個圖示名,和當前的test.py檔案在同一個目錄下