網站首頁 編程語言 正文
安裝pyinstall
pip install pyinstaller
注意事項
除非必要,否則盡量不要直接import module,用from xxx import xxx來代替,減少打包需要加載的模塊,
縮減最終的exe體積
參數詳解
usage: pyinstaller [-h] [-v] [-D] [-F] [--specpath DIR] [-n NAME]
[--add-data <SRC;DEST or SRC:DEST>]
[--add-binary <SRC;DEST or SRC:DEST>] [-p DIR]
[--hidden-import MODULENAME]
[--additional-hooks-dir HOOKSPATH]
[--runtime-hook RUNTIME_HOOKS] [--exclude-module EXCLUDES]
[--key KEY] [-d {all,imports,bootloader,noarchive}] [-s]
[--noupx] [--upx-exclude FILE] [-c] [-w]
[-i <FILE.ico or FILE.exe,ID or FILE.icns>]
[--version-file FILE] [-m <FILE or XML>] [-r RESOURCE]
[--uac-admin] [--uac-uiaccess] [--win-private-assemblies]
[--win-no-prefer-redirects]
[--osx-bundle-identifier BUNDLE_IDENTIFIER]
[--runtime-tmpdir PATH] [--bootloader-ignore-signals]
[--distpath DIR] [--workpath WORKPATH] [-y]
[--upx-dir UPX_DIR] [-a] [--clean] [--log-level LEVEL]
scriptname [scriptname ...]
positional arguments:
?? ?scriptname
?? ?要處理的腳本文件的名稱或正好一個.spec文件。 如果指定了.spec文件,則大多數選項是不必要的,將被忽略。
可選參數:
? -h,--help顯示此幫助消息并退出
? -v,--version顯示程序版本信息并退出。
? --distpath DIR放置捆綁的應用程序的位置(默認值:。\ dist)
? --workpath WORKPATH將所有臨時工作文件,.log,.pyz放在哪里
? ? ? ? ? ? ? ? ? ? ? ? 等(默認值:。\ build)
? -y,--noconfirm替換輸出目錄(默認值:
? ? ? ? ? ? ? ? ? ? ? ? SPECPATH \ dist \ SPECNAME)而不要求
? ? ? ? ? ? ? ? ? ? ? ? 確認
? --upx-dir UPX_DIR UPX實用程序的路徑(默認值:搜索執行)
? ? ? ? ? ? ? ? ? ? ? ? 路徑)
? -a,-ascii不包括unicode編碼支持(默認值:
? ? ? ? ? ? ? ? ? ? ? ? 包括(如果有)
? --clean清理PyInstaller緩存并刪除臨時文件
? ? ? ? ? ? ? ? ? ? ? ? 在建造之前。
? --log-level LEVEL生成時控制臺消息中的詳細信息量。水平
? ? ? ? ? ? ? ? ? ? ? ? 可能是TRACE,DEBUG,INFO,WARN,ERROR,
? ? ? ? ? ? ? ? ? ? ? ? 嚴重(默認:INFO)。
產生什么:
? -D,--onedir創建一個包含可執行文件的單文件夾捆綁包
? ? ? ? ? ? ? ? ? ? ? ? (默認)
? -F,--onefile創建一個文件捆綁的可執行文件。
? --specpath DIR文件夾,用于存儲生成的規范文件(默認值:
? ? ? ? ? ? ? ? ? ? ? ? 當前目錄)
? -n NAME,--name NAME分配給捆綁的應用程序和規范文件的名稱
? ? ? ? ? ? ? ? ? ? ? ? (默認值:第一個腳本的基本名稱)
捆綁內容,搜索位置:
? --add-data <SRC; DEST或SRC:DEST>
? ? ? ? ? ? ? ? ? ? ? ? 要添加到的其他非二進制文件或文件夾
? ? ? ? ? ? ? ? ? ? ? ? 可執行文件。路徑分隔符是平臺
? ? ? ? ? ? ? ? ? ? ? ? 特定的`os.pathsep``(在Windows上是``;``
? ? ? ? ? ? ? ? ? ? ? ? 和``:``在大多數Unix系統上)。這個選項
? ? ? ? ? ? ? ? ? ? ? ? 可以多次使用。
? --add-binary <SRC; DEST或SRC:DEST>
? ? ? ? ? ? ? ? ? ? ? ? 要添加到可執行文件的其他二進制文件。
? ? ? ? ? ? ? ? ? ? ? ? 有關更多詳細信息,請參見--add-data選項。這個
? ? ? ? ? ? ? ? ? ? ? ? 該選項可以多次使用。
? -p DIR,--paths DIR搜索導入的路徑(例如使用PYTHONPATH)。
? ? ? ? ? ? ? ? ? ? ? ? 允許使用多個路徑,以“;”分隔,或使用
? ? ? ? ? ? ? ? ? ? ? ? 此選項多次
? --hidden-import MODULENAME,-hiddenimport MODULENAME
? ? ? ? ? ? ? ? ? ? ? ? 命名在代碼中不可見的導入
? ? ? ? ? ? ? ? ? ? ? ? 腳本。此選項可以多次使用。
? --additional-hooks-dir HOOKSPATH
? ? ? ? ? ? ? ? ? ? ? ? 搜索鉤子的其他路徑。這個選項
? ? ? ? ? ? ? ? ? ? ? ? 可以多次使用。
? --runtime-hook RUNTIME_HOOKS
? ? ? ? ? ? ? ? ? ? ? ? 定制運行時掛鉤文件的路徑。運行時掛鉤是
? ? ? ? ? ? ? ? ? ? ? ? 與可執行文件捆綁在一起的代碼是
? ? ? ? ? ? ? ? ? ? ? ? 在設置任何其他代碼或模塊之前執行
? ? ? ? ? ? ? ? ? ? ? ? 運行時環境的特殊功能。這個
? ? ? ? ? ? ? ? ? ? ? ? 該選項可以多次使用。
? --exclude-module排除
? ? ? ? ? ? ? ? ? ? ? ? 可選模塊或軟件包(Python名稱,而不是
? ? ? ? ? ? ? ? ? ? ? ? 路徑名稱)將被忽略(好像不是)
? ? ? ? ? ? ? ? ? ? ? ? 找到)。此選項可以多次使用。
? --key KEY用于加密Python字節碼的密鑰。
如何產生:
? -d {all,imports,bootloader,noarchive},--debug {all,imports,bootloader,noarchive}
? ? ? ? ? ? ? ? ? ? ? ? 提供調試凍結的協助
? ? ? ? ? ? ? ? ? ? ? ? 應用。可以多次提供此參數
? ? ? ? ? ? ? ? ? ? ? ? 選擇以下幾個選項的時間。
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? -全部:以下所有三個選項。
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? -導入:為基礎指定-v選項
? ? ? ? ? ? ? ? ? ? ? ? ? Python解釋器,導致其打印消息
? ? ? ? ? ? ? ? ? ? ? ? ? 每次模塊初始化時,顯示
? ? ? ? ? ? ? ? ? ? ? ? ? 來源(文件名或內置模塊)
? ? ? ? ? ? ? ? ? ? ? ? ? 已加載。看到
? ? ? ? ? ? ? ? ? ? ? ? ? https://docs.python.org/3/using/cmdline.html#id4。
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? -自舉程序:告訴自舉程序發出進度
? ? ? ? ? ? ? ? ? ? ? ? ? 初始化并啟動
? ? ? ? ? ? ? ? ? ? ? ? ? 捆綁的應用。用于診斷問題
? ? ? ? ? ? ? ? ? ? ? ? ? 缺少進口。
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? -存檔:而不是存儲所有凍結的Python
? ? ? ? ? ? ? ? ? ? ? ? ? 源文件作為結果中的存檔
? ? ? ? ? ? ? ? ? ? ? ? ? 可執行文件,將它們存儲為文件
? ? ? ? ? ? ? ? ? ? ? ? ? 輸出目錄。
? ? ? ? ? ? ? ? ? ? ? ??
? -s,--strip將符號表條應用于可執行文件并
? ? ? ? ? ? ? ? ? ? ? ? 共享庫
pyinstaller最佳使用方式
常用的命令為
pyinstall -i xxx.ico -n xxx -w -D main.py
其中 -D 參數或 -F 參數后面跟的是入口文件,即你 python xxx.py 運行程序時這個xxx.py文件
對應依賴比較多的程序,建議使用 -D, -F更適合單文件的py腳本。
pyinstaller 打包其實分兩步走
第一步,通過上面的命令執行打包,此時會生成相應的spec文件
大體流程如下:
1、在腳本目錄生成 xxx.spec 文件(看-n參數,沒傳,則與xxx.py同名為xxx);?
2、創建一個 build 目錄;?
3、寫入一些日志文件和中間流程文件到 build 目錄;?
4、創建 dist 目錄;?
5、生成可執行文件或文件夾到 dist 目錄;
效果如下:
第一步完成后,獲得xxx.spec,然后再執行
第二步:對xxx.spec文件執行pyinstaller 指令
pyinstaller xxx.spec
完成打包
進入dist中打包好的文件夾后,雙腳運行可執行文件則可
這是一個利用tkinter構建界面的簡單程序
spec文件解析
一個spec文件的例子。
block_cipher =None
a =Analysis(['minimal.py'],
pathex=['/Developer/PItests/minimal'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
ciper=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,...)
coll = COLLECT(...)
spec文件中主要包含4個class: Analysis, PYZ, EXE 和 COLLECT.
- Analysis以py文件為輸入,它會分析py文件的依賴模塊,并生成相應的信息
- PYZ是一個.pyz的壓縮包,包含程序運行需要的所有依賴
- EXE根據上面兩項生成
- COLLECT生成其他部分的輸出文件夾,COLLECT也可以沒有
手動修改spec文件
有時候PyInstaller自動生成的spec文件并不能滿足我們的需求,最常見的情況就是我們的程序依賴我們本地的一些數據文件,這個時候就需要我們自己去編輯spec文件來添加數據文件了。 上面的spec文件解析中Analysis中的datas就是要添加到項目中的數據文件,我們可以編輯datas.
a =Analysis(
...
datas =[('you/source/file/path','file_name_in_project'),
('source/file2','file_name2')]
...
)
可以認為datas是一個List,每個元素是一個二元組。元組的第一個元素是你本地文件索引,第二個元素是拷貝到項目中之后的文件名字。除了上面那種寫法,也可以將其提出來。
added_files =[...]
a =Analysis(
...
datas = added_files,
...
)
筆記: pyinstaller的常見問題
到此為止pyinstaller的知識已經大致了解,但是并沒有解決是實操時, 主py文件調用其他py文件(自定義的)時,無法找到該模塊的問題。如下圖:
嘗試解決1:
根據下面網友經驗,在spec文件中加入根目錄:
...
a = Analysis(['test1.py'],
pathex=['D:\Python_X64\dynamic_positioning'], # 加入根目錄,且text2.py也在該目錄中
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
...
嘗試解決1,測試結果:
記過如上修改,問題重要解決。程序不再報錯,并且正常運行。
以下上是給我啟發的網友的操作方式,記錄并感謝
實驗項目結構
在sampleproject目錄下執行tree /f 查看文件結構
pyinstaller -F ?-c simple.py -p __init__.py -p test_install.py
打包多個py文件的命令
pyinstaller [主文件] -p [其他文件1] -p [其他文件2] --hidden-import [自建模塊1] --hidden-import [自建模塊2]?
其中sample.py是主程序入口文件,其他.py文件是自建模塊(test_install.py)。所以在執行下面命令:
pyinstaller -F -c simple.py -p __init__.py -p test_install.py
執行完成后會產生2個文件夾build,dist和一個文件simple.spec
進入exe目錄并成功執行exe程序
OK 這樣就完成了打包的程序,事實上,我并不是這么順利,中間也遇到些問題
遇到的問題
Failed to execute script ‘simple’ due to unhandled exception!
首先看下py文件的內容,內容瞎寫的,只是為了測試!!!
test_install.py 文件
def install_test():
? ? print('install test!')
simple.py 調用 test_install.py 中的方法
注意:方法1和方法2 的區別在于 導入模塊的方式
- simple.py 文件
方式一
import test_install ? ?# import xxx 導入方式
...
test_install.install_test()
- 方式二?
?from test_install import install_test ? # from xxx import xxx 導入方式
?...
?install_test()
這2種方式用python simple.py 都是能通過的,然而方式一和方式二打包后都有報錯ModuleNotFoundError: No module named ‘test_install’
[37320] Failed to execute script ‘simple’ due to unhandled exception!
筆記:我顯示的報錯和這位網友并不相同。顯示內容如下:
解決方法:
原因 install_test 是在sample包下,導入路徑要寫上父包的路徑
方式三
from sample.test_install import install_test ? # 增加了sample,但是,我的sample為項目目錄,pycharm會報錯的
...
install_test()
方式四
from sample import test_install?? ??? ??? ??? ?# 這種寫法比較有趣,由于我的sample為項目目錄,pycharm會報錯的
...
test_install.install_test()
筆記:由于項目目錄的原因,方式3和方式4我的測試并不成功。也許不是項目目錄應該可以解決。與我的解決思路感覺是一致的。
遇到的問題
NameError: name ‘exit’ is not defined
解決方法:在simple.py中使用的exit()替換為sys.exit()
出錯的原因exit 用于給交互式 Shell 返回值,而 sys.exit 是用于程序內部
Python 中的 exit() 和 sys.exit() 的區別
exit is a helper for the interactive shell - sys.exit is intended for use in programs.
The site module (which is imported automatically during startup, except if the -S command-line option is given) adds several constants to the built-in namespace (e.g. exit). They are useful for the interactive interpreter shell and should not be used in programs.
Note that there is a third exit option, namely os._exit, which exits without calling cleanup handlers, flushing stdio buffers, etc. (and which should normally only be used in the child process after a fork()).
對于上面的引用的理解:
exit()/quit(), 拋出 SystemExit 異常. 一般在交互式 Shell 中退出時使用.
sys.exit(n) 退出程序引發 SystemExit 異常, 可以捕獲異常執行些清理工作. n 默認值為 0, 表示正常退出. 其他都是非正常退出. 還可以 sys.exit(“sorry, goodbye!”); 一般主程序中使用此退出.
os._exit(n), 直接退出, 不拋異常, 不執行相關清理工作. 常用在子進程的退出.
原文鏈接:https://blog.csdn.net/wu_zhiyuan/article/details/127470244
相關推薦
- 2022-06-09 忘記Grafana不要緊2種Grafana重置admin密碼方法詳細步驟_服務器其它
- 2022-09-13 Golang優雅保持main函數不退出的辦法_Golang
- 2022-12-12 python字符串中兩個大括號{{}}的使用及說明_python
- 2022-04-20 Django學習之靜態文件與模板詳解_python
- 2022-07-27 C++詳細講解圖的拓撲排序_C 語言
- 2022-07-03 Android實現翻頁特效_Android
- 2022-10-31 sql查詢給表起別名要點小結(涉及嵌套查詢)_oracle
- 2022-08-16 python可視化分析繪制散點圖和邊界氣泡圖_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支