前言
本篇文章,詳細(xì)介紹pyinstaller多種打包過程。去坑,填坑。
1)使用下面的命令即可安裝(win10)
pip install pyinstaller
二、使用參數(shù)
1采用命令行的方式
1)參數(shù)介紹
| 選項(xiàng)參數(shù) | 參數(shù)解釋 | | -h | help(幫助信息) | | -v | version(版本號) | | -c | 顯示命令行窗口 | | -w | 不顯示命令行窗口 | | -F(大寫) | 生成結(jié)果是一個(gè)exe程序,所有依賴項(xiàng)被打包進(jìn)該exe程序中 | | -D(大寫) | 生成結(jié)果是一個(gè)包含exe程序的目錄,所有依賴項(xiàng)和exe程序位于同一目錄下 | | -i | 為生成的exe程序指定一個(gè)icon格式的圖標(biāo) | | -n | name(指定生成的.exe和.spec文件名) | | –distpath | 指定打包后的程序存放目錄,默認(rèn)存放在當(dāng)前目錄下的(新建的)dist目錄 | | –workpath | 為輸出的所有臨時(shí)文件指定存放目錄 |
2) 使用示例
在調(diào)試過程中不推薦加-w參數(shù)這樣程序可能一閃而過,不能確定是執(zhí)行完畢還是bug終止。
pyinstaller -F -w setup.py
2采用編寫.spec腳本方式。
1)生成.spec方式
pyi-makespec -F -w setup.py
或者
pyinstaller -F -w setup.py
也會(huì)生成.spec,不過推薦將生成的build文件夾和dist文件夾刪掉。
2).spec腳本參數(shù)介紹
# -*- mode: python ; coding: utf-8 -*-
win_no_prefer_redirects=False, win_private_assemblies=False, pyz = PYZ(a.pure, a.zipped_data,
bootloader_ignore_signals=False, disable_windowed_traceback=False,
生成的腳本就是這樣的,包含以下主要配置參數(shù)
| 參數(shù) | 含義 | | a | Analysis類的實(shí)例,主要分析.py文件的依賴項(xiàng),如第三方庫以及import模塊。a中內(nèi)容主要包括以下四部分:scripts,放入.py文件。;pure,程序代碼文件中的純Python模塊,包括程序的代碼文件本身;binaries,需要的二進(jìn)制文件。;datas,非二進(jìn)制文件。 | | pyz | PYZ的實(shí)例,是一個(gè).pyz文件,包含了所有pure中的所有Python模塊。 | | exe | EXE類的實(shí)例,處理Analysis和PYZ的結(jié)果的,用來生成最后的exe可執(zhí)行程序。 | | coll | COLLECT類的實(shí)例,用于創(chuàng)建輸出目錄。只有-D命令下才會(huì)實(shí)例化,-F不會(huì)生成目錄。 | | block_cipher | 加密密鑰(一般無加密需求,可不設(shè)置) |
而我們一般在配置時(shí)大多數(shù)情況下只涉及a,也就是Analysis類,下面逐一分析a里面的參數(shù)
| Analysis的參數(shù) | 簡介以及可能存在的問題 | | scripts | 首先是一個(gè)列表(list),應(yīng)該存放與打包文件相關(guān)的所有.py文件。如果不存放的話會(huì)出現(xiàn)import錯(cuò)誤 no module 的問題。 | | pathex | 默認(rèn)有一個(gè)spec的目錄,記得把用到的模塊的路徑添加到這個(gè)list變量里。 默認(rèn)的路徑是你打包的.py文件的同級路徑。 存在問題:當(dāng)引入自己的文件時(shí)添加此路徑并不起作用。仍會(huì)報(bào)錯(cuò) ModuleNotFoundError: No module named 'core' | | datas | 將資源文件或文件夾,復(fù)制到打包后的目錄中,而datas中必須以元組形式否則會(huì)出現(xiàn)下面錯(cuò)誤。注意一點(diǎn)放到這里面的文件不會(huì)被編譯,而是復(fù)制,所以重要的文件放到這里很容易泄露。 ValueError: too many values to unpack (expected 2)
| | binaries | 添加二進(jìn)制文件,也是一個(gè)列表,定義方式與datas參數(shù)一樣。 | | hiddenimports | 隱式導(dǎo)入的模塊,比如在__import__、imp.find_module()、exec、eval等語句中導(dǎo)入的模塊,這些模塊PyInstaller是找不到的,需要手動(dòng)指定導(dǎo)入, | | hookspath | 指定額外hook文件(可以是py文件)的查找路徑。 | | runtime_hooks | 指定自定義的運(yùn)行時(shí)hook文件路徑(可以是py文件) | | excludes | 指定可以被忽略的可選的模塊或包。 |
|
|
三、可能遇到的問題以及解決辦法。
1)打包過程找不到自己自建模塊如
ModuleNotFoundError: No module named 'core'
可以將模塊添加到datas里注意復(fù)制后的名字('core','core')最好是原名(個(gè)人經(jīng)驗(yàn))。
還可以將自己的模塊直接復(fù)制到site-packages 下面,再打包。
2)打包成功卻不能正確執(zhí)行,進(jìn)程無法阻塞,.exe一直在循環(huán)。
這是因?yàn)樵谡{(diào)用某些模塊的時(shí)候,也是進(jìn)程,而在多進(jìn)程中,你程序中的進(jìn)程不會(huì)被阻塞,而一直循環(huán)起進(jìn)程。用下面方法去解決,注意下面代碼要放在代碼最開始在import 模塊之前。
from multiprocessing import freeze_support
四、總結(jié)
這篇文章會(huì)解決常見的pyinstaller 打包問題,文章中錯(cuò)誤的地方歡迎小伙伴指出。
|