pyinstaller打包exe程序的步驟和添加依賴文件的實現(xiàn)
pyinstaller打包exe程序和添加依賴文件
或許我們并不是專業(yè)的程序猿,但是卻可以通過python來提高我們的工作效率,減少加班時間,讓代碼替我們完成一些重復的工作,節(jié)省下來的時間去泡個妹子,牽牽小手不香嗎
話不多說,馬上進入本次pyinstaller打包工具知識分享,隔壁家小東女朋友叫我待會一起去吃飯呢。。。。。
1、安裝pyinstaller庫
命令行輸入以下命令,如圖顯示是我已經裝過了:
pip install pyinstaller
2、pyinstaller的打包機制
python腳本的運行離不開python解釋器,把腳本打包成exe可執(zhí)行文件時,pyinstaller會將python解釋器和腳本一起打包,同時把需要用到的第三方庫和依賴包一并打入到exe文件中,下面我就以最近寫的一款裝包工具為例,簡述一下我的打包過程。
3、打包命令
pyinstaller-F [main.py]
這條命令指的是將以main.py為主程序的腳本打包為單獨一個exe文件,-F參數表示覆蓋打包,無論打多少次包都會是最新的。你可以選擇cmd命令行進行操作,也可以使用pycharm的Terminal端口進行,我使用的是Terminal。如圖。
運行完畢后,會看到build,dist,和.spec文件生成。dist里面的exe文件就是剛剛生成的可執(zhí)行文件,這樣簡單快捷的打包就完成啦。
4、添加導包外的一些依賴文件
像第3步這種情況是程序中不需要依賴外部文件的,假如程序邏輯中需要依賴一些文件,但pyinstaller并不會將自動把這些文件幫你打包進去,比如,一個第三方庫中有一段程序需要去使用public.xml文件,當打包完成后,這個文件是不會自動打包進去的,那該怎么辦呢?
別急,pyinstaller為我們提供了參數配置文件,也就是剛剛生成的.spec文件,我們只需要再datas中配置需要打包的文件即可,比如
datas=[('D:\\python3.6.5\\Lib\\site-packages\\androguard\\core\\resources\\public.xml','androguard\\core\\resources')
表示的是將public.xml文件打包到androguard\core\resources目錄下
其他的一些參數配置請自行百度,如有時需要讓pyinstaller不打包某些用不到的模塊,可通過在excludes=[]中添加此模塊實現(xiàn),如excludes=[‘xxx’]。
5、.spec方式打包
這樣修改后我們就可以使用命令進行再次打包啦,打包完成后打開軟件,發(fā)現(xiàn)需要用到依賴文件已經成功打包,相關功能就正常啦。
pyinstaller -D xxx.spec
6、pyinstaller常用參數
另外,騷強也是整理了一下pyinstaller的常用參數,有興趣可以試一試哦,坑已經準備好了,各位勇士快來踩一踩
-F
,–onefile
打包一個單個文件,如果你的代碼都寫在一個.py文件的話,可以用這個,如果是多個.py文件就別用-D
,–onedir
打包多個文件,在dist中生成很多依賴文件,適合以框架形式編寫工具代碼,我個人比較推薦這樣,代碼易于維護-K
,–tk
在部署時包含 TCL/TK-a
,–ascii
不包含編碼.在支持Unicode的python版本上默認包含所有的編碼.-d
,–debug
產生debug版本的可執(zhí)行文件-w
,–windowed
,–noconsole
使用Windows子系統(tǒng)執(zhí)行.當程序啟動的時候不會打開命令行(只對Windows有效)-c
,–nowindowed
,–console
使用控制臺子系統(tǒng)執(zhí)行(默認)(只對Windows有效)
pyinstaller -c ?xxxx.py pyinstaller xxxx.py --console
-s
,–strip
可執(zhí)行文件和共享庫將run through strip.注意Cygwin的strip往往使普通的win32 Dll無法使用.-X
,–upx
如果有UPX安裝(執(zhí)行Configure.py時檢測),會壓縮執(zhí)行文件(Windows系統(tǒng)中的DLL也會)(參見note)-o DIR
,–out=DIR
指定spec文件的生成目錄,如果沒有指定,而且當前目錄是PyInstaller的根目錄,會自動創(chuàng)建一個用于輸出(spec和生成的可執(zhí)行文件)的目錄.如果沒有指定,而當前目錄不是PyInstaller的根目錄,則會輸出到當前的目錄下.-p DIR
,–path=DIR
設置導入路徑(和使用PYTHONPATH效果相似).可以用路徑分割符(Windows使用分號,Linux使用冒號)分割,指定多個目錄.也可以使用多個-p參數來設置多個導入路徑,讓pyinstaller自己去找程序需要的資源–icon=
將file.ico添加為可執(zhí)行文件的資源(只對Windows系統(tǒng)有效),改變程序的圖標 pyinstaller -i ico路徑 xxxxx.py–icon=
將file.exe的第n個圖標添加為可執(zhí)行文件的資源(只對Windows系統(tǒng)有效)-v FILE
,–version=FILE
將verfile作為可執(zhí)行文件的版本資源(只對Windows系統(tǒng)有效)-n NAME
,–name=NAME
可選的項目(產生的spec的)名字.如果省略,第一個腳本的主文件名將作為spec的名字
pyinstall打包時的依賴問題
前幾天寫了一個人臉表情分析的小程序,想用pyinstall打包成一個可以移植的小軟件。因為之前用過pyinstall,所以這次使用同樣的方法對我的程序進行打包:
【pyinstaller -F --icon=圖標.ico 要打包的文件.py --noconsole】
其中【-F】參數表示打包后生成單一的文件。pyinstall還有其他的一些參數可供選擇:
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.
但是當我使用之前同樣的方法打包完成后,也生成了一個exe程序,雙擊執(zhí)行的時候,什么也沒有發(fā)生。在pycharm中運行良好的程序,到exe就什么都沒有了,最恐怖的是連報錯都沒有??!
這時,可以使用【-C】參數,生成控制臺版本的exe程序。這樣會在【dist】文件夾下生成一個以程序命名的文件夾,在這個文件夾中會有這個exe程序。
我們在控制臺下執(zhí)行這個程序,如果程序無法正常執(zhí)行的話,會輸出錯誤信息:
看來我的錯誤是因為無法打開這個dat文件,我想起來我在程序中用到了這個數據文件,可能打包的時候,pyinstall沒有吧這個需要的依賴文件裝進exe程序中。
這時一種方法是吧這個dat文件拷貝進這個exe所在的文件夾中。
另一種方法就是修改【spec】文件。
打開spec文件,在datas參數里面添加依賴文件的路徑
然后重新打包這個spec文件:【pyinstall from_video.spec】即可。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
YOLOv5在圖片上顯示統(tǒng)計出單一檢測目標的個數實例代碼
各位讀者首先要認識到的問題是,在YOLOv5中完成錨框計數是一件非常簡單的工作,下面這篇文章主要給大家介紹了關于YOLOv5如何在圖片上顯示統(tǒng)計出單一檢測目標的個數的相關資料,需要的朋友可以參考下2023-03-03使用python opencv對畸變圖像進行矯正的實現(xiàn)
本文主要介紹了使用python opencv對畸變圖像進行矯正的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05django orm 通過related_name反向查詢的方法
今天小編就為大家分享一篇django orm 通過related_name反向查詢的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python深度學習之使用Albumentations對圖像做增強
諸如RandomCrop和CenterCrop之類的某些增強功能可能會變換圖像,使其不包含所有原始邊界框. 本示例說明如何使用名為RandomSizedBBoxSafeCrop的變換來裁剪圖像的一部分,但保留原始圖像的所有邊界框,需要的朋友可以參考下2021-05-05