pyinstaller打包exe程序的步驟和添加依賴文件的實(shí)現(xiàn)
pyinstaller打包exe程序和添加依賴文件
或許我們并不是專業(yè)的程序猿,但是卻可以通過(guò)python來(lái)提高我們的工作效率,減少加班時(shí)間,讓代碼替我們完成一些重復(fù)的工作,節(jié)省下來(lái)的時(shí)間去泡個(gè)妹子,牽牽小手不香嗎
話不多說(shuō),馬上進(jìn)入本次pyinstaller打包工具知識(shí)分享,隔壁家小東女朋友叫我待會(huì)一起去吃飯呢。。。。。
1、安裝pyinstaller庫(kù)
命令行輸入以下命令,如圖顯示是我已經(jīng)裝過(guò)了:
pip install pyinstaller

2、pyinstaller的打包機(jī)制
python腳本的運(yùn)行離不開(kāi)python解釋器,把腳本打包成exe可執(zhí)行文件時(shí),pyinstaller會(huì)將python解釋器和腳本一起打包,同時(shí)把需要用到的第三方庫(kù)和依賴包一并打入到exe文件中,下面我就以最近寫的一款裝包工具為例,簡(jiǎn)述一下我的打包過(guò)程。
3、打包命令
pyinstaller-F [main.py]
這條命令指的是將以main.py為主程序的腳本打包為單獨(dú)一個(gè)exe文件,-F參數(shù)表示覆蓋打包,無(wú)論打多少次包都會(huì)是最新的。你可以選擇cmd命令行進(jìn)行操作,也可以使用pycharm的Terminal端口進(jìn)行,我使用的是Terminal。如圖。

運(yùn)行完畢后,會(huì)看到build,dist,和.spec文件生成。dist里面的exe文件就是剛剛生成的可執(zhí)行文件,這樣簡(jiǎn)單快捷的打包就完成啦。
4、添加導(dǎo)包外的一些依賴文件
像第3步這種情況是程序中不需要依賴外部文件的,假如程序邏輯中需要依賴一些文件,但pyinstaller并不會(huì)將自動(dòng)把這些文件幫你打包進(jìn)去,比如,一個(gè)第三方庫(kù)中有一段程序需要去使用public.xml文件,當(dāng)打包完成后,這個(gè)文件是不會(huì)自動(dòng)打包進(jìn)去的,那該怎么辦呢?

別急,pyinstaller為我們提供了參數(shù)配置文件,也就是剛剛生成的.spec文件,我們只需要再datas中配置需要打包的文件即可,比如
datas=[('D:\\python3.6.5\\Lib\\site-packages\\androguard\\core\\resources\\public.xml','androguard\\core\\resources')
表示的是將public.xml文件打包到androguard\core\resources目錄下

其他的一些參數(shù)配置請(qǐng)自行百度,如有時(shí)需要讓pyinstaller不打包某些用不到的模塊,可通過(guò)在excludes=[]中添加此模塊實(shí)現(xiàn),如excludes=[‘xxx’]。
5、.spec方式打包
這樣修改后我們就可以使用命令進(jìn)行再次打包啦,打包完成后打開(kāi)軟件,發(fā)現(xiàn)需要用到依賴文件已經(jīng)成功打包,相關(guān)功能就正常啦。
pyinstaller -D xxx.spec
6、pyinstaller常用參數(shù)
另外,騷強(qiáng)也是整理了一下pyinstaller的常用參數(shù),有興趣可以試一試哦,坑已經(jīng)準(zhǔn)備好了,各位勇士快來(lái)踩一踩
-F,–onefile打包一個(gè)單個(gè)文件,如果你的代碼都寫在一個(gè).py文件的話,可以用這個(gè),如果是多個(gè).py文件就別用-D,–onedir打包多個(gè)文件,在dist中生成很多依賴文件,適合以框架形式編寫工具代碼,我個(gè)人比較推薦這樣,代碼易于維護(hù)-K,–tk在部署時(shí)包含 TCL/TK-a,–ascii不包含編碼.在支持Unicode的python版本上默認(rèn)包含所有的編碼.-d,–debug產(chǎn)生debug版本的可執(zhí)行文件-w,–windowed,–noconsole使用Windows子系統(tǒng)執(zhí)行.當(dāng)程序啟動(dòng)的時(shí)候不會(huì)打開(kāi)命令行(只對(duì)Windows有效)-c,–nowindowed,–console使用控制臺(tái)子系統(tǒng)執(zhí)行(默認(rèn))(只對(duì)Windows有效)
pyinstaller -c ?xxxx.py pyinstaller xxxx.py --console
-s,–strip可執(zhí)行文件和共享庫(kù)將run through strip.注意Cygwin的strip往往使普通的win32 Dll無(wú)法使用.-X,–upx如果有UPX安裝(執(zhí)行Configure.py時(shí)檢測(cè)),會(huì)壓縮執(zhí)行文件(Windows系統(tǒng)中的DLL也會(huì))(參見(jiàn)note)-o DIR,–out=DIR指定spec文件的生成目錄,如果沒(méi)有指定,而且當(dāng)前目錄是PyInstaller的根目錄,會(huì)自動(dòng)創(chuàng)建一個(gè)用于輸出(spec和生成的可執(zhí)行文件)的目錄.如果沒(méi)有指定,而當(dāng)前目錄不是PyInstaller的根目錄,則會(huì)輸出到當(dāng)前的目錄下.-p DIR,–path=DIR設(shè)置導(dǎo)入路徑(和使用PYTHONPATH效果相似).可以用路徑分割符(Windows使用分號(hào),Linux使用冒號(hào))分割,指定多個(gè)目錄.也可以使用多個(gè)-p參數(shù)來(lái)設(shè)置多個(gè)導(dǎo)入路徑,讓pyinstaller自己去找程序需要的資源–icon=將file.ico添加為可執(zhí)行文件的資源(只對(duì)Windows系統(tǒng)有效),改變程序的圖標(biāo) pyinstaller -i ico路徑 xxxxx.py–icon=將file.exe的第n個(gè)圖標(biāo)添加為可執(zhí)行文件的資源(只對(duì)Windows系統(tǒng)有效)-v FILE,–version=FILE將verfile作為可執(zhí)行文件的版本資源(只對(duì)Windows系統(tǒng)有效)-n NAME,–name=NAME可選的項(xiàng)目(產(chǎn)生的spec的)名字.如果省略,第一個(gè)腳本的主文件名將作為spec的名字
pyinstall打包時(shí)的依賴問(wèn)題
前幾天寫了一個(gè)人臉表情分析的小程序,想用pyinstall打包成一個(gè)可以移植的小軟件。因?yàn)橹坝眠^(guò)pyinstall,所以這次使用同樣的方法對(duì)我的程序進(jìn)行打包:
【pyinstaller -F --icon=圖標(biāo).ico 要打包的文件.py --noconsole】
其中【-F】參數(shù)表示打包后生成單一的文件。pyinstall還有其他的一些參數(shù)可供選擇:
What to generate:
-F,--onefile
create a single file deployment
-D,--onedir
create a single directory deployment (default)
-o DIR,--out=DIR
create the spec file in directory. If not specified, and the current directory is Installer’s root directory, an output subdirectory will be created. Otherwise the current directory is used.
-n NAME,--name=NAME
optional name to assign to the project (from which the spec file name is generated). If omitted, the basename of the (first) script is used.
但是當(dāng)我使用之前同樣的方法打包完成后,也生成了一個(gè)exe程序,雙擊執(zhí)行的時(shí)候,什么也沒(méi)有發(fā)生。在pycharm中運(yùn)行良好的程序,到exe就什么都沒(méi)有了,最恐怖的是連報(bào)錯(cuò)都沒(méi)有??!
這時(shí),可以使用【-C】參數(shù),生成控制臺(tái)版本的exe程序。這樣會(huì)在【dist】文件夾下生成一個(gè)以程序命名的文件夾,在這個(gè)文件夾中會(huì)有這個(gè)exe程序。
我們?cè)诳刂婆_(tái)下執(zhí)行這個(gè)程序,如果程序無(wú)法正常執(zhí)行的話,會(huì)輸出錯(cuò)誤信息:

看來(lái)我的錯(cuò)誤是因?yàn)闊o(wú)法打開(kāi)這個(gè)dat文件,我想起來(lái)我在程序中用到了這個(gè)數(shù)據(jù)文件,可能打包的時(shí)候,pyinstall沒(méi)有吧這個(gè)需要的依賴文件裝進(jìn)exe程序中。
這時(shí)一種方法是吧這個(gè)dat文件拷貝進(jìn)這個(gè)exe所在的文件夾中。
另一種方法就是修改【spec】文件。
打開(kāi)spec文件,在datas參數(shù)里面添加依賴文件的路徑

然后重新打包這個(gè)spec文件:【pyinstall from_video.spec】即可。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
YOLOv5在圖片上顯示統(tǒng)計(jì)出單一檢測(cè)目標(biāo)的個(gè)數(shù)實(shí)例代碼
各位讀者首先要認(rèn)識(shí)到的問(wèn)題是,在YOLOv5中完成錨框計(jì)數(shù)是一件非常簡(jiǎn)單的工作,下面這篇文章主要給大家介紹了關(guān)于YOLOv5如何在圖片上顯示統(tǒng)計(jì)出單一檢測(cè)目標(biāo)的個(gè)數(shù)的相關(guān)資料,需要的朋友可以參考下2023-03-03
使用python opencv對(duì)畸變圖像進(jìn)行矯正的實(shí)現(xiàn)
本文主要介紹了使用python opencv對(duì)畸變圖像進(jìn)行矯正的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Python基礎(chǔ)語(yǔ)法之變量與數(shù)據(jù)類型詳解
這篇文章主要為大家詳細(xì)介紹了Python基礎(chǔ)語(yǔ)法中變量與數(shù)據(jù)類型的用法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下2022-07-07
django orm 通過(guò)related_name反向查詢的方法
今天小編就為大家分享一篇django orm 通過(guò)related_name反向查詢的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python深度學(xué)習(xí)之使用Albumentations對(duì)圖像做增強(qiáng)
諸如RandomCrop和CenterCrop之類的某些增強(qiáng)功能可能會(huì)變換圖像,使其不包含所有原始邊界框. 本示例說(shuō)明如何使用名為RandomSizedBBoxSafeCrop的變換來(lái)裁剪圖像的一部分,但保留原始圖像的所有邊界框,需要的朋友可以參考下2021-05-05
Python數(shù)據(jù)結(jié)構(gòu)與算法中的棧詳解(3)
這篇文章主要為大家詳細(xì)介紹了Python中的棧,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03

