pyinstaller使用大全
背景
在python工程完成開發(fā)以后需要編譯成可執(zhí)行文件,如此一來(lái)生產(chǎn)環(huán)境和開發(fā)環(huán)境隔離開來(lái)便于用戶使用(可獨(dú)立使用,無(wú)需配置python開發(fā)環(huán)境),pyinstaller可以方便地將腳本編譯成exe
1. pyinstaller的安裝
pip install pyinstaller
2. pyinstaller工作原理
- 先生成一個(gè)spec文件(手動(dòng)或自動(dòng)均可),該文件決定了實(shí)際編譯規(guī)則
- 再自動(dòng)生成一個(gè)build文件夾,所有自動(dòng)編譯的中間產(chǎn)物都放在其中
- 最后生成dist文件夾,存放編譯輸出
3. pyinstaller打包成exe
3.1 最簡(jiǎn)單(單個(gè)文件):
pyinstaller xxx.py
一般搞法(多文件)
- 先自動(dòng)生成spec文件:
pyi-makespec xxx.py
- 再根據(jù)自己的實(shí)際需求手動(dòng)修改spec文件
- 最后統(tǒng)一installer:
pyinstaller xxx.spec
F 生成一個(gè)單一可執(zhí)行文件【常用】
w 禁止彈出控制臺(tái)【常用】
i 修改exe生成的圖標(biāo)【常用】
h 打印幫助信息
v 打印版本信息
d 生成帶各種依賴的文件夾,包含exe,dll,以及其他文件
p 指定搜索路徑
3.3 spec文件解析
Analysis: ['Console.py','xxx.py'...] <- 此處列出的腳本生成exe后會(huì)按順序依次執(zhí)行! pathex <- 此處為搜索路徑 binaries <- 非python的庫(kù)文件 datas <- ini文件,字體,圖片,icon什么的 pure <- python模塊 PYZ: <- 不用管 EXE: <- 輸出配置 COLLECT: <- 不用管
3.4 打包dll
在生成的spec文件中修改datas字段,形如:
3.5 利用upx壓縮exe
運(yùn)行命令: pyinstaller xxx.spec --upx [輸出路徑]
4. 常見問(wèn)題
4.1 打包后的文件太大了
方法1 —— 虛擬環(huán)境下打包
造成打包文件太大的主要原因是打包了太多不必要的庫(kù),比如安裝了anaconda。或者自己pip install了太多庫(kù)。顯然要想解決該問(wèn)題核心就是不要打包那么多的庫(kù)。
最好的辦法是:在一個(gè)虛擬環(huán)境中單獨(dú)打包,只打包該程序執(zhí)行所必備的依賴庫(kù)
具體操作方法是:
- 先安裝 pipenv工具,在該工具的幫助下創(chuàng)建虛擬環(huán)境單獨(dú)打包
pip install pipenv
- 進(jìn)入虛擬環(huán)境:
pipenv shell
- 嘗試運(yùn)行一下應(yīng)用程序,缺什么包就單獨(dú)pip install安裝什么包
python xxx.py
- 當(dāng)前面的應(yīng)用程序都可以用的時(shí)候再安裝pyinstaller,然后進(jìn)行打包即可
pip install pyinstaller ,pyinstaller -Fw xxx.py
- 退出虛擬環(huán)境
exit
關(guān)于pipenv更詳細(xì)使用請(qǐng)參閱
方法2 —— 排除不相干的包
在*.spec的excludes欄目中添加對(duì)應(yīng)的, 常見: excludes=['matplotlib', 'pandas', 'scipy']
,
也可以通過(guò)命令行排除: pyinstaller.exe --exclude xxx_package yyy.py
4.2 明明python xxx.py能正常使用, 而打包成exe卻無(wú)法使用了
主要有以下幾種現(xiàn)象:
- 編譯后的exe在打包的機(jī)器上運(yùn)行良好,放到別人機(jī)器上不能用了。
- python xxx.py能正常使用, 而打包成exe卻無(wú)法使用了。
目前所知主要是兩個(gè)方面的原因:
- 路徑問(wèn)題。
- 依賴包的問(wèn)題。
python腳本執(zhí)行的默認(rèn)路徑和exe打包后的路徑是不一樣的,如果軟件中存在文件讀取等操作,很有可能導(dǎo)致exe找不到資源而運(yùn)行出錯(cuò)。
解決該問(wèn)題的方法是路徑凍結(jié)
#frozen_dir.py import os,sys def app_path(): if hasattr(sys, 'frozen'): return os.path.dirname(sys.executable) return os.path.dirname(__file__)
添加frozen_dir.py后,app_path會(huì)生成一個(gè)絕對(duì)準(zhǔn)確的基地址,所有的路徑以此為基準(zhǔn),如下所示:
import frozen_dir SETUP_DIR = frozen_dir.app_path()
依賴包的問(wèn)題往往出現(xiàn)在:在一開始就pyinstaller打包過(guò)程序,后續(xù)開發(fā)時(shí)又安裝了新模塊,如此一來(lái)python xxx.py可以正常執(zhí)行腳本,但是運(yùn)行xxx.exe報(bào)錯(cuò)。
錯(cuò)誤根源可能是:pyinstaller是不會(huì)更新__pycache__文件夾的,所以后面增加的模塊它不知道,也不會(huì)打包進(jìn)去的:
解決方法非常簡(jiǎn)單:把打包中生成的資源全部刪除【__ pycache __, build, dist】,然后重新打包即可
4.3 打包后exe執(zhí)行速度太慢了啊
解決方法1:精簡(jiǎn)代碼,刪除不必要的內(nèi)容
解決方法2: 用-D -w 打包,缺點(diǎn)是文件太多
pyinstaller -D -w -i icon.ico XX.py
FAQ A: -F打包成的exe可以用,帶上-w參數(shù)去掉console框就不能用了
Q:暫未解決(跟源碼中需要獲取cmd執(zhí)行輸出有關(guān))
A:-i增加自定義icon功能后,目錄下不含icon資源exe執(zhí)行異常
Q:暫未解決
A: No module named pkg_resources
Q: 有可能是setuptools版本太高所致(請(qǐng)參考文末擴(kuò)展知識(shí)),pip install setuptools==44.0.0
即可
A:failed to execute pyi_rth_pkgres
Q: 有可能是pyinstaller的版本問(wèn)題,卸載重新安裝一下,參考:
擴(kuò)展:
Pyinstaller No module named pkg_resources.py2_warn
我通過(guò)降低setuptools版本到 44.0.0 后成功解決問(wèn)題。
pip install setuptools==44.0.0?
參考鏈接
Pyinstaller打包附帶DLL、圖標(biāo)和壓縮EXE方法
到此這篇關(guān)于pyinstaller使用大全的文章就介紹到這了,更多相關(guān)pyinstaller使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+Turtle動(dòng)態(tài)繪制一棵樹實(shí)例分享
這篇文章主要介紹了Python+Turtle動(dòng)態(tài)繪制一棵樹實(shí)例分享,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01python正則表達(dá)式中匹配次數(shù)與貪心問(wèn)題詳解(+??*)
正則表達(dá)式是一個(gè)特殊的字符序列,它能幫助你方便的檢查一個(gè)字符串是否與某種模式匹配,下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式中匹配次數(shù)與貪心問(wèn)題(+??*)的相關(guān)資料,需要的朋友可以參考下2022-10-10謹(jǐn)慎使用Python進(jìn)行矩陣計(jì)算解析
這篇文章主要介紹了使用Python進(jìn)行矩陣計(jì)算原理解析,真正的單位矩陣,只有對(duì)角線元素為1,其他元素為0,用 np.identity(N) 生成單位矩陣,需要的朋友可以參考下2023-08-08python tkiner實(shí)現(xiàn) 一個(gè)小小的圖片翻頁(yè)功能的示例代碼
這篇文章主要介紹了python tkiner實(shí)現(xiàn) 一個(gè)小小的圖片翻頁(yè)功能,需要的朋友可以參考下2020-06-06Python3如何實(shí)現(xiàn)Win10桌面自動(dòng)切換
這篇文章主要介紹了Python3如何實(shí)現(xiàn)Win10桌面自動(dòng)切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08python 實(shí)現(xiàn)UTC時(shí)間加減的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)UTC時(shí)間加減的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python超詳細(xì)實(shí)現(xiàn)字體反爬流程
大家好,本篇文章主要講的是python查策網(wǎng)字體反爬實(shí)例,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-05-05