PyInstaller打包Python項目詳解
</h1>
<div class="clear"></div>
<div class="postBody">
PyInstaller打包Python詳解
- 官網參考
一、PyInstaller簡介
1.PyInstaller可以将Python項目在不同平台上打包為可執行檔案.
2.PyInstaller打包的流程:讀取編寫好的Python項目-->分析其中條用的子產品和庫,并收集其檔案副本(包括Python的解釋器)-->将副本和Python項目檔案(放在一個檔案夾//封裝在一個可執行檔案)中.
二、pyinstaller的參數清單
參數 | 參數意義 |
---|---|
-F --onefile | 1.打包單個檔案,産生一個檔案用于部署(預設),如果代碼都寫在一個.py檔案時使用,項目有多個檔案時不要使用 pyinstaller -F xxx.py pyinstaller --onefile xxxx.py |
-D --onedir | 1.打包多個檔案,産生一個目錄用于部署(預設),用于架構編寫的代碼打包 pyinstaller -D xxx.py(項目入口檔案) pyinstaller --onedir xxx.py(項目入口檔案) |
--key=keys | 1.使用keys進行加密打包 pyinstaller --key=1234 -F xx.py |
-K --tk | 1.在部署時包含 TCL/TK |
-a --ascii | 1.不包含編碼.在支援Unicode的python版本上預設包含所有的編碼 |
-d --debug | 1.産生debug版本的可執行檔案 |
-n name --name=name | 1.可選的項目(産生的spec的)名字name 2.第一個腳本的主檔案名将作為spec的名字(預設) pyinstaller -F -n my_file_name xxx.py pyinstaller -F --name=my_file_name xxx.py |
-o dir -- out=dir | 1.指定spec檔案的生成目錄dir 2.如果沒有指定且目前目錄是PyInstaller的根目錄,會自動建立一個用于輸出(spec和生成的可執行檔案)的目錄 3.如果沒有指定切目前目錄不是PyInstaller的根目錄,則會輸出到目前的目錄下 |
-p dir --path=dir | 1.用來添加程式所用到的包的所在位置,設定導入路徑(和使用pythonpath效果相似) 2.可以用路徑分割符(Windows使用分号,Linux使用冒号)分割,指定多個目錄.也可以使用多個-p參數來設定多個導入路徑,讓Pyintaller自己去找程式需要的資源 |
-w --windowed --noconsole | 1.表示去掉控制台視窗,使用Windows子系統執行,當程式啟動的時候不會打開指令行(隻對Windows有效) pyinstaller -c xxx.py pyinstaller xxx.py --noconsole |
-c --nowindowed --console | 1.表示打開控制台視窗,使用控制台子系統執行,當程式啟動的時候會打開指令行(預設)(隻對Windows有效) pyinstaller -c xxx.py pyinstaller xxx.py --console |
-i --icon=<file.ioc> | 1.将file.ico添加為可執行檔案的資源,改變程式的圖示(隻對Windows系統有效) pyinstaller -F -i file.ico xxx.py pyinstall -F --icon=<file.ioc> xxx.py |
--icon=<file.exe,n> | 1.将file.exe的第n個圖示添加為可執行檔案的資源(隻對Windows系統有效) |
-v file --version=file | 1.将verfile作為可執行檔案的版本資源(隻對Windows系統有效) |
-s --strip | 1.可執行檔案和共享庫将run through strip.注意Cygwin的strip往往使普通的win32 Dll無法使用 |
-X --upx | 1.如果有UPX安裝(執行Configure.py時檢測),會壓縮執行檔案(Windows系統中的DLL也會)(參見note) |
三、Pyinstaller的使用
- PyInstaller在Windows/Linux/Mac環境下的使用:執行指令相同,隻需要在不同環境下執行即可
1.pyinstaller的安裝
pip install pyinstaller
2.執行指令
- 2.1打包單個檔案
# 1.執行指令
pyinstaller -F xxx.py
# 2.去生成的dist檔案夾找xxx.exe運作
# 3.運作成功,xxx.exe則為可執行檔案,删除其它檔案
- 2.2打包多個檔案
# 1.執行指令,xxx.py為程式入口檔案
pyinstall -D xxx.py
# 2.删除生成的bulid和dist檔案夾,僅保留xxx.spec檔案
# 3.修改xxx.spec檔案,詳見2.2.1
# 4.執行指令
pyinstaller -F xxx.spec
# 5.去dist檔案夾下找xxx.exe檔案
# 6.運作成功,删除臨時檔案目錄build;dist目錄為打包的結果,可執行檔案和其它程式運作的關聯檔案都在這個目錄下
- 2.2.1 xxx.spec配置檔案詳解
block_cipher = None
# 以py檔案為輸入,分析py檔案的依賴子產品,并生成相應的資訊
a = Analysis([‘xxx.py’], # 要打包.py檔案名清單,和xxx.py同級可以不同添加
pathex=[‘D:\abc\def\project_v1.0’], # 項目路徑
binaries=[], # 程式調用外部pyd、dll檔案(二進制檔案路徑)以數組形式傳入;例:(‘D:\pro\text.dll’, ‘pro’),将’pdftotext.dll’pro,與原項目結構一緻即可
datas=[], # 存放的資源檔案(圖檔、文本等靜态檔案)以數組形成傳入;例:(‘D:\static\c.ioc’,‘static’),将’cc.ioc’打包之後放在static目錄,與原項目結構一緻即可
hiddenimports=[], # pyinstaller解析子產品時可能會遺漏某些子產品(not visible to the analysis phase),造成打包後執行程式時出現類似No Module named xxx;這時就需要在hiddenimports中加入遺漏的子產品
hookspath=[],
runtime_hooks=[],
excludes=[], # 去除不必要的子產品import,寫在excludes中添加此子產品
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
# .pyz的壓縮包,包含程式運作需要的所有依賴
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
# 根據Analysis和PYZ生成單個exe程式所需要的屬性及其配置
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name=‘xxx’, # 生成exe檔案的名字
debug=False, # debug模式
strip=False,
upx=True,
console=False, # 是否在打開exe檔案時打開cmd指令框
icon=‘C:\Users\xx.ico’ ) # 設定exe程式圖示,ico格式檔案(16*16)
# 收集前三個部分的内容進行整合,生成程式所需要的依賴包,及資源檔案和配置
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name=‘fastplot’)
四、踩坑
- 編輯.spec檔案路徑相關
1.windows盡量使用絕對路徑,用雙斜杠\ \
2.linux路徑/home/my_project/web
3..路徑避免使用中文
- 打包.spec檔案報錯:RecursionError: maximum recursion depth exceeded
1.在spec檔案上添加遞歸深度的設定
import sys
sys.setrecursionlimit(5000)
- 更換exe圖示報錯:AttributeError: module 'win32ctypes.pywin32.win32api' has no attribute 'error'
1.圖示的大小建議(64*64): https://lvwenhan.com/convertico/
2.圖示的顔色嚴格限制:256,真彩色是不行的
- 打包錯誤:ModuleNotFoundError: No module named 'xxxxx'
方法1:pyinstaller -D --hidden-import="xxxxx" main.py
方法2:在xxx.spec中配置hiddenimports=['xxxxx']
- 運作exe檔案報錯:Failed to excute Script main
1.使用-c模式重新打包調試,找的缺失的子產品,pip install安裝
- 檔案打包後過大
1.在程式中盡量不使用import xx;而是使用 from xx import xx
分類: Python
<div id="blog_post_info">
好文要頂 關注我 收藏該文
丶小白吖
關注 - 9
粉絲 - 0 +加關注 0 0
<div class="clear"></div>
<div id="post_next_prev">
<a href="https://www.cnblogs.com/bbiu/p/11675630.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" class="p_n_p_prefix">« </a> 上一篇: <a href="https://www.cnblogs.com/bbiu/p/11675630.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" title="釋出于 2019-10-19 20:05">supervisor安裝/配置</a>
<br>
<a href="https://www.cnblogs.com/bbiu/p/13578549.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" class="p_n_p_prefix">» </a> 下一篇: <a href="https://www.cnblogs.com/bbiu/p/13578549.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" title="釋出于 2020-08-28 17:08">Python3内置資料結構</a>
posted @ 2020-06-29 18:33 丶小白吖 閱讀( 1127) 評論( 0) 編輯 收藏
</div><!--end: topics 文章、評論容器-->