本文分四個步驟來詳講如何用PyInstaller將py文件打包成exe文件 1. PyInstaller 簡介 2. PyInstaller 安裝 3. 將py文件打包成exe文件 4. PyInstaller打包常見問題 ...
py文件打包成exe文件的方式一共有三種:py2exe、PyInstaller和cx_Freeze
本文分四個步驟來詳講如何用PyInstaller將py文件打包成exe文件
1. PyInstaller 簡介
2. PyInstaller 安裝
3. 將py文件打包成exe文件
4. PyInstaller打包常見問題
一. PyInstaller簡介
1.python相關文件介紹
python作為一門解釋型腳本語言,它有三種發佈方式:
.py文件 : 源碼文件,運行需要使用者安裝Python環境並且安裝依賴的各種庫
.pyc文件:pyc文件是Python解釋器可以識別的二進位碼,可跨平臺的,需要使用者安裝相應版本的Python和依賴庫。
可執行文件:不需要安裝python環境和依賴庫,可針對不同平臺需要打包不同的可執行文件(Windows,Linux,Mac,...)
2.PyInstaller的原理簡介
1. PyInstaller工具可以把python解析器和腳本打包成一個可執行的文件,並不是編譯成真正的機器碼,打包成一個可執行文件後運行效率可能會降低,好處就是在使用者的機器上可以不用安裝python和你的腳本依賴的庫。
2. 利用PyInstaller對指定的的腳本打包時,會先分析腳本所依賴的其他腳本,然後根據導包路徑去查找,把所有相關的腳本收集起來,包括Python解析器,然後根據你的命令參數可分別生成文件夾,或者打包成一個可執行文件。
3. 無論是生成的文件夾里的可執行文件或者只打包成一個可執行文件都可以直接運行,前者需要把整個文件夾都給別人。
註意⚠️:PyInstaller打包的執行文件,只能在和打包機器系統同樣的環境下。也就是說,不具備可移植性,若需要在不同系統上運行,就必須針對該平臺進行打包。
二. PyInstaller的安裝
這裡建議安裝python環境管理工具conda,做到不同的環境隔離
https://www.cnblogs.com/trotl/p/11863544.html
1. PyInstaller在windows下的安裝
使用命令pip install PyInstaller即可
在windows下,pyinstaller需要PyWin32的支持。當用pip安裝PyInstaller時未找到PyWin32,會自動安裝pypiwin32
2. PyInstaller在mac,linux下的安裝
pip install PyInstaller
三. PyInstaller打包
1. options參數說明
通用參數
與生成結果有關參數
Windows和Mac特有的參數
2. 基本語法:
PyInstaller -F -w -i xxx.ico dev.py --hidden-import=pandas._libs.tslibs.timedeltas
常用參數:
-F 指只生成一個exe文件,不生成其他dll文件
-w 不彈出交互視窗,如果你想程式運行的時候,與程式進行交互,則不加該參數
-i 設定程式圖標 ,其後面的xxx.ico文件就是程式小圖標
dev.py 要打包的程式,如果你不是在dev.py同一級目錄下執行的打包命令,這裡得寫上dev.py的路徑地址
–hidden-import=pandas._libs.tslibs.timedeltas 隱藏相關模塊的引用
註意⚠️:你在哪個目錄下執行的命令,預設打包完成的文件或者文件夾就在該目錄
四. PyInstaller打包常見問題
⚠️避坑點(打包之前請先看看):
1. 路徑最好為英文,沒有中文字元;
2. 腳本名稱里沒有特殊字元
3. 使用utf-8編碼
4. 圖標文件必須是正常格式,為.ico文件
5. 命令使用pyinstaller和pyinstaller.exe結果都是一樣的
6. 參數的添加得在pyinstaller和dev.py文件中間,不能隨意位置添加
7. 如果你打包的代碼中用到了靜態文件,如圖片和資源文件,需手動複製到文件夾中,否則exe文件會報找不到文件的錯
8. 代碼里導包最好使用from的方式,可節省打包後的文件大小
9. 就是當你使用錯誤的參數去打包或者打包到一半中斷,等等此類運行到一半沒了的情況。會導致你原來的py文件變成一個0KB的空文件。裡面的代碼會全部消失!!!所以以後需要有個良好的習慣,就是複製一份代碼出來,用這個副本進行打包。並且參數出錯,或者打錯了導致失敗時,檢查下副本文件的py文件是否還存在再繼續重新打包,不然打出來的就是空的文件,自然一直閃退,因為壓根沒內容(這點我沒遇到過,來自別人的提醒)
10. pygame代碼調試的時候要在結束時加quit()不然程式會崩潰
11. py文件運行沒問題,不代表你打包後的文件運行就沒問題,所以在打包好文件,打算運行exe文件測試時一定要錄屏,因為報錯會一閃而逝然後程式關閉,不仔細看的話,發現不了還報錯,只會認為程式一運行就閃退,會讓人不明所以,都不知道為什麼,只有清楚報的什麼錯才好去解決,所以,一定要錄屏!!!!
12. 如果在py文件中用到了多進程,且你在Windows下編譯需要加一行代碼在開頭,multiprocessing.freeze_support()
13. 打包的時候要進入到能運行這個py文件的虛擬環境中,不能在別的環境中對py文件打包,不然打包的結果還是你原來的環境,可能打包文件過大,或者引起缺失包等其他問題
14. 如果有打包錯誤,具體看build里的warn***.txt文檔,裡面詳細記載了錯誤的原因。一般都是庫丟失
⚠️Bug:
1. “IndexError: tuple index out of range”
錯誤分析:這個問題是當前的pyinstaller版本不支持python的版本
解決辦法:修改pyinstaller的版本,pip install pyinstaller==適合你的版本
2. ImportError: C extension: No module named‘pandas._libs.tslibs.timedeltas’
錯誤分析:因為我的代碼中引用了pandas庫,然後使用pyinstaller打包的時候顯示模塊缺失
解決辦法:
1. 忽略此模塊(打包時加上–hidden-import=pandas._libs.tslibs.timedeltas)
2. 添加文件
在你的python3的安裝路徑下找到PyInstaller/hooks的位置
如C:\Python36\Lib\site-packages\PyInstaller\hooks
新建文件hook-pandas.py,並填寫以下內容:
hiddenimports=[
#all your previous hidden imports
'pandas', 'pandas._libs.tslibs.timedeltas'
]