文章目錄
- 前言
- PyInstaller
- 特點
- 跨平臺支持
- 自動依賴項處理
- 單文件發布
- 支持圖形用戶界面(GUI)和命令行界面(CLI)應用
- 支持多種打包選項
- 基本用法
- 常用參數
- 其它參數
- 版本 & 環境
- 實現步驟
- 安裝 PyInstaller
- 創建 Python 腳本
- 使用 PyInstaller 打包
- 運行
- 總結
- 個人簡介
前言
- Python 是一門強大而靈活的編程語言,然而,在與非技術人員分享 Python 腳本時,他們可能不具備安裝 Python 解釋器的經驗。為了方便共享和部署,我們可以將 Python 腳本打包為可執行文件(.exe),這樣其他用戶就無需安裝 Python 環境,直接運行可執行文件即可。本文將介紹如何使用 PyInstaller 工具實現這一目標。
PyInstaller
- PyInstaller是一個用于將Python腳本打包成獨立可執行文件的工具。它的目標是方便地將Python應用程序分發給沒有安裝Python解釋器的用戶,使得Python腳本可以在沒有Python環境的系統上運行。
特點
跨平臺支持
- PyInstaller可以在Windows、Linux和MacOS等多個平臺上運行,并生成相應平臺的可執行文件。
自動依賴項處理
- PyInstaller會自動檢測Python腳本的依賴項,并將它們打包到生成的可執行文件中。
單文件發布
- 使用–onefile選項,可以將所有的依賴項打包成一個單獨的可執行文件,方便分發和部署。
支持圖形用戶界面(GUI)和命令行界面(CLI)應用
- PyInstaller適用于各種類型的Python應用,包括包含圖形用戶界面的桌面應用和命令行工具。
支持多種打包選項
- PyInstaller提供了許多命令行選項,允許用戶靈活配置打包過程,例如指定可執行文件的名稱、添加圖標、手動添加依賴項等。
基本用法
pyinstaller your_script.py
常用參數
--onefile(-F)
: 將所有依賴項打包成一個單獨的可執行文件。
pyinstaller --onefile your_script.py
--name your_custom_name
: 指定生成的可執行文件的名稱。
pyinstaller --name your_custom_name your_script.py
--icon=your_icon.ico
: 指定生成的可執行文件的圖標。圖標文件通常是 .ico 格式。
pyinstaller --onefile --icon=your_icon.ico your_script.py
--hidden-import=module_name
: 手動添加缺失的依賴項
pyinstaller --onefile --requirements=requirements.txt your_script.py
--requirements=requirements.txt
: 指定包含依賴項列表的文件。
pyinstaller --onefile --requirements=requirements.txt your_script.py
其它參數
--clean: 在打包前刪除臨時文件和輸出目錄。
--debug: 在調試模式下運行 PyInstaller。
--log-level: 指定日志級別,如 --log-level=DEBUG。
-w 是一個命令行選項,用于生成無控制臺窗口的可執行文件。
-p 用于添加模塊搜索路徑。
版本 & 環境
- Python 2.7
- Windows 11 家庭中文版
實現步驟
安裝 PyInstaller
- 首先確保你已經安裝了
Python
。然后,打開命令行或終端,并運行以下命令安裝PyInstaller
:
pip install pyinstaller
- 注意:由于本人使用的是
Python 2.7
,Python 2.7
已經在2020年結束了官方支持。然而,PyInstaller 3.6.0
是最后一個官方宣布支持Python 2.x
的版本。因此我們需要指定PyInstaller
的版本,否則會安裝失敗。
pip install pyinstaller==3.6.0
創建 Python 腳本
- 編寫你的 Python 腳本,并確保它能夠在你的本地 Python 環境中正常運行。這個腳本將是最終可執行文件的源代碼。
- 這里我直接使用最近編寫的一個爬蟲小程序作為示例。
使用 PyInstaller 打包
$ pyinstaller --onefile -p venv/Lib/site-packages 20231207.py
39 INFO: PyInstaller: 3.6
39 INFO: Python: 2.7.18
39 INFO: Platform: Windows-10-10.0.22621
39 INFO: wrote C:\Users\MQiuj\PycharmProjects\pythonProject\20231207.spec
40 INFO: UPX is not available.
45 INFO: Extending PYTHONPATH with paths
['C:\\Users\\MQiuj\\PycharmProjects\\pythonProject','C:\\Users\\MQiuj\\PycharmProjects\\pythonProject\\venv\\Lib\\site-packages','C:\\Users\\MQiuj\\PycharmProjects\\pythonProject']
45 INFO: checking Analysis
46 INFO: Building because pathex changed
46 INFO: Initializing module dependency graph...
46 INFO: Caching module graph hooks...
53 INFO: Caching module dependency graph...
61 INFO: running Analysis Analysis-00.toc
62 INFO: Adding Microsoft.VC90.CRT to dependent assemblies of final executablerequired by c:\python27\python.exe
115 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9635_none_acd031d7e1db7c28.manifest
167 INFO: Searching for assembly amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.9635_none ...
167 INFO: Found manifest C:\WINDOWS\WinSxS\Manifests\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9635_none_08e2c157a83ed5da.manifest
168 INFO: Searching for file msvcr90.dll
168 INFO: Found file C:\WINDOWS\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9635_none_08e2c157a83ed5da\msvcr90.dll
168 INFO: Searching for file msvcp90.dll
168 INFO: Found file C:\WINDOWS\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9635_none_08e2c157a83ed5da\msvcp90.dll
168 INFO: Searching for file msvcm90.dll
168 INFO: Found file C:\WINDOWS\WinSxS\amd64_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9635_none_08e2c157a83ed5da\msvcm90.dll
219 INFO: Found C:\WINDOWS\WinSxS\Manifests\amd64_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.9635_none_acd031d7e1db7c28.manifest
219 INFO: Adding redirect Microsoft.VC90.CRT version (9, 0, 21022, 8) -> (9, 0, 30729, 9635)
240 INFO: Analyzing C:\Users\MQiuj\PycharmProjects\pythonProject\20231207.py
951 INFO: Processing pre-safe import module hook urllib3.packages.six.moves
2621 INFO: Processing module hooks...
2621 INFO: Loading module hook "hook-httplib.py"...
2622 INFO: Loading module hook "hook-encodings.py"...
2865 INFO: Loading module hook "hook-certifi.py"...
2874 INFO: Looking for ctypes DLLs
2874 INFO: Analyzing run-time hooks ...
2875 INFO: Including run-time hook 'pyi_rth_certifi.py'
2877 INFO: Looking for dynamic libraries
2930 INFO: Looking for eggs
2930 INFO: Using Python library C:\WINDOWS\system32\python27.dll
2930 INFO: Found binding redirects:
[BindingRedirect(name=u'Microsoft.VC90.CRT', language=None, arch=u'amd64', oldVersion=(9, 0, 21022, 8), newVersion=(9, 0, 30729, 9635), publicKeyToken=u'1fc8b3b9a1e18e3b')]
2933 INFO: Warnings written to C:\Users\MQiuj\PycharmProjects\pythonProject\build\20231207\warn-20231207.txt
2951 INFO: Graph cross-reference written to C:\Users\MQiuj\PycharmProjects\pythonProject\build\20231207\xref-20231207.html
2982 INFO: checking PYZ
2983 INFO: Building because toc changed
2983 INFO: Building PYZ (ZlibArchive) C:\Users\MQiuj\PycharmProjects\pythonProject\build\20231207\PYZ-00.pyz
3257 INFO: Building PYZ (ZlibArchive) C:\Users\MQiuj\PycharmProjects\pythonProject\build\20231207\PYZ-00.pyz completed successfully.
3288 INFO: checking PKG
3288 INFO: Building because toc changed
3288 INFO: Building PKG (CArchive) PKG-00.pkg
3384 INFO: Redirecting Microsoft.VC90.CRT version (9, 0, 21022, 8) -> (9, 0, 30729, 9635)
4298 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
4299 INFO: Bootloader c:\python27\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
4299 INFO: checking EXE
4300 INFO: Building because toc changed
4300 INFO: Building EXE from EXE-00.toc
4300 INFO: Appending archive to EXE C:\Users\MQiuj\PycharmProjects\pythonProject\dist\20231207.exe
4306 INFO: Building EXE from EXE-00.toc completed successfully.
- 注:由于部分依賴沒有自動掃描打入可執行文件中,使用
-p
命令手動指定依賴打入。
運行
- 點擊
20231207.exe
運行,按照預期運行:
總結
- 本文介紹了
pyinstaller
工具的使用以及常用參數,并結合實際案例進行實戰將我們的Pyhton
腳本打包為了.exe
可執行文件。
個人簡介
👋 你好,我是 Lorin 洛林,一位 Java 后端技術開發者!座右銘:Technology has the power to make the world a better place.
🚀 我對技術的熱情是我不斷學習和分享的動力。我的博客是一個關于Java生態系統、后端開發和最新技術趨勢的地方。
🧠 作為一個 Java 后端技術愛好者,我不僅熱衷于探索語言的新特性和技術的深度,還熱衷于分享我的見解和最佳實踐。我相信知識的分享和社區合作可以幫助我們共同成長。
💡 在我的博客上,你將找到關于Java核心概念、JVM 底層技術、常用框架如Spring和Mybatis 、MySQL等數據庫管理、RabbitMQ、Rocketmq等消息中間件、性能優化等內容的深入文章。我也將分享一些編程技巧和解決問題的方法,以幫助你更好地掌握Java編程。
🌐 我鼓勵互動和建立社區,因此請留下你的問題、建議或主題請求,讓我知道你感興趣的內容。此外,我將分享最新的互聯網和技術資訊,以確保你與技術世界的最新發展保持聯系。我期待與你一起在技術之路上前進,一起探討技術世界的無限可能性。
📖 保持關注我的博客,讓我們共同追求技術卓越。