Python使用PyInstaller/pip打包與發(fā)布的詳細(xì)指南
本篇博客從零到一帶你熟悉:
- PyInstaller:把 Python 項(xiàng)目打包成 EXE / APP
- pip 包發(fā)布流程:把你的項(xiàng)目推向 PyPI
- 常見(jiàn)坑與最佳實(shí)踐
讓你寫的 Python 程序能真正“走出去”,觸達(dá)更多真實(shí)用戶。
一、使用 PyInstaller 打包可執(zhí)行程序
1. PyInstaller 是什么
PyInstaller 是將 Python 程序打包成可執(zhí)行文件(如 Windows 的 .exe)的最常用工具。它會(huì)把 Python 解釋器 + 所有依賴打包進(jìn)一個(gè)獨(dú)立文件,用戶無(wú)需 Python 環(huán)境即可運(yùn)行。
適合場(chǎng)景:
- 給用戶分發(fā)桌面工具
- 內(nèi)部辦公自動(dòng)化腳本
- GUI 程序(Tkinter、PyQt、wxPython 等)
- 命令行工具
2. PyInstaller 基本使用
安裝:
pip install pyinstaller
最簡(jiǎn)單的打包:
pyinstaller main.py
完成后,目錄結(jié)構(gòu)如下:
dist/
main/
main.exe
build/
main.spec
最終可執(zhí)行文件就在 dist 目錄里。
3. 常用參數(shù)(必須掌握)
單文件打包
pyinstaller -F main.py
優(yōu)點(diǎn):只生成一個(gè) .exe 缺點(diǎn):?jiǎn)?dòng)稍慢
隱藏控制臺(tái)窗口(GUI 程序)
pyinstaller -F -w main.py
加入圖標(biāo)
pyinstaller -F -i icon.ico main.py
添加數(shù)據(jù)文件(圖片、配置、模型)
推薦在 .spec 文件中配置:
a = Analysis(
...,
datas=[('config.yml', 'config.yml'), ('assets/', 'assets/')],
)
然后:
pyinstaller main.spec
4. 打包常見(jiàn)問(wèn)題(超實(shí)用)
(1)打包后無(wú)法運(yùn)行 / 缺少模塊
原因:PyInstaller 未能自動(dòng)識(shí)別依賴 解決:
pyinstaller -F main.py --hidden-import xx_module
(2)打包文件太大?
解決方式:
- 使用 UPX 壓縮
- 刪除 matplotlib/numpy 中用不到的 DLL
(3)Mac 打包的 app 無(wú)法在另一臺(tái) Mac 運(yùn)行
因?yàn)?macOS 的簽名安全機(jī)制,建議:
- 在目標(biāo)版本系統(tǒng)構(gòu)建(如 macOS 14)
- 結(jié)合
codesign --deep進(jìn)行簽名
二、Python 包發(fā)布到 PyPI(pip install 可用)
讓別人可以:
pip install yourpackage
這是專業(yè) Python 開(kāi)發(fā)者的重要能力之一。
1. 項(xiàng)目結(jié)構(gòu)(最推薦)
myproject/
myproject/
__init__.py
core.py
tests/
README.md
pyproject.toml
LICENSE
最關(guān)鍵:使用 pyproject.toml(現(xiàn)代標(biāo)準(zhǔn))
2. 使用 build 進(jìn)行構(gòu)建
安裝:
pip install build twine
構(gòu)建:
python -m build
生成:
dist/
myproject-1.0.0.tar.gz
myproject-1.0.0-py3-none-any.whl
3. 發(fā)布到 TestPyPI
避免污染正式 PyPI。
twine upload --repository testpypi dist/*
安裝測(cè)試版:
pip install -i https://test.pypi.org/simple/ myproject
4. 正式發(fā)布到 PyPI
twine upload dist/*
全世界的人就都可以:
pip install myproject
5. pyproject.toml 示例(最推薦)
下面是一個(gè)專業(yè)示例,可直接復(fù)用:
[build-system]
requires = ["setuptools>=61", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "myproject"
version = "1.0.0"
authors = [
{ name="Your Name", email="you@example.com" }
]
description = "A powerful and modern Python utility."
readme = "README.md"
license = { file="LICENSE" }
requires-python = ">=3.8"
dependencies = ["requests", "numpy"]
[project.urls]
Homepage = "https://github.com/you/myproject"
Documentation = "https://myproject-docs.com"
6. PyPI 發(fā)布常見(jiàn)問(wèn)題
403 權(quán)限錯(cuò)誤
未創(chuàng)建 API Token 或 Token 配置錯(cuò)誤 → 進(jìn)入 pypi.org/manage/account/ 創(chuàng)建 Token 并更新 .pypirc
版本號(hào)沖突
PyPI 版本號(hào)不能重復(fù) → 每次發(fā)布前更新版本號(hào)(如:1.0.1 → 1.0.2)
依賴未安裝
確保 dependencies 正確寫到 pyproject.toml
三、兩者對(duì)比:應(yīng)該用哪個(gè)
| 場(chǎng)景 | PyInstaller | PyPI 包發(fā)布 |
|---|---|---|
| 給普通用戶(沒(méi) Python 環(huán)境) | ? 最佳選擇 | ? |
| 給開(kāi)發(fā)者 | ? | ??(最推薦) |
| 分發(fā) GUI 工具 | ? | 無(wú)意義 |
| 庫(kù) / SDK 發(fā)布 | ? | ?最佳 |
四、最佳實(shí)踐總結(jié)
辦公/桌面工具 → PyInstaller:穩(wěn)定、方便、用戶無(wú)須 Python
開(kāi)發(fā)者工具 → PyPI 發(fā)布:現(xiàn)代 Python 項(xiàng)目的標(biāo)準(zhǔn)做法
推薦結(jié)合 CI 自動(dòng)化發(fā)布:GitHub Actions + PyPI + build 可以做到“打 tag 自動(dòng)發(fā)布”
到此這篇關(guān)于Python使用PyInstaller/pip打包與發(fā)布的詳細(xì)指南的文章就介紹到這了,更多相關(guān)Python項(xiàng)目打包與發(fā)布內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用PyInstaller打包Python項(xiàng)目過(guò)程
- 使用PyInstaller打包Python腳本為可執(zhí)行文件的詳細(xì)指南
- python之PyInstaller(將Python腳本打包為可執(zhí)行文件方式)
- 使用PyInstaller如何打包一個(gè)包含多個(gè)文件的Python項(xiàng)目
- PyInstaller打包Python腳本的使用示例
- 如何將python代碼打包成pip包(可以pip?install)
- Pyinstaller+Pipenv打包Python文件的實(shí)現(xiàn)示例
- Python基于pip實(shí)現(xiàn)離線打包過(guò)程詳解
相關(guān)文章
【python】matplotlib動(dòng)態(tài)顯示詳解
這篇文章主要介紹了matplotlib動(dòng)態(tài)顯示,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Python基礎(chǔ)教程之增加和去除數(shù)字的千位分隔符
千位分隔符其實(shí)就是數(shù)字中的逗號(hào),下面這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之增加和去除數(shù)字的千位分隔符,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
Python內(nèi)置函數(shù)all()的實(shí)現(xiàn)
Python內(nèi)置函數(shù)?all()?用于判斷可迭代對(duì)象中的所有元素是否都為真值(Truthy),是邏輯判斷的重要工具,下面就來(lái)具體介紹如何使用,感興趣的可以了解一下2025-04-04
Python?常用模塊threading和Thread模塊之線程池
這篇文章主要介紹了Python?threading和Thread模塊之線程池,線程池如消費(fèi)者,負(fù)責(zé)接收任務(wù),并將任務(wù)分配到一個(gè)空閑的線程中去執(zhí)行。并不關(guān)心是哪一個(gè)線程執(zhí)行的這個(gè)任務(wù),具體介紹需要的小伙伴可以參考下面文章詳細(xì)內(nèi)容2022-06-06
Python asyncio核心原理與高階應(yīng)用全解析
這篇文章主要介紹了Python asyncio核心原理與高階應(yīng)用,asyncio是Python中強(qiáng)大的異步I/O框架,它允許我們編寫高效的并發(fā)代碼,通過(guò)掌握asyncio的高級(jí)應(yīng)用,我們可以編寫更加高效、響應(yīng)迅速的應(yīng)用程序,需要的朋友可以參考下2026-05-05
Python實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的方法詳解
優(yōu)先級(jí)隊(duì)列(priority queue)是0個(gè)或多個(gè)元素的集合,每個(gè)元素都有一個(gè)優(yōu)先權(quán),接下來(lái)就來(lái)看一下簡(jiǎn)潔的Python實(shí)現(xiàn)優(yōu)先級(jí)隊(duì)列結(jié)構(gòu)的方法詳解:2016-06-06
pycharm解決關(guān)閉flask后依舊可以訪問(wèn)服務(wù)的問(wèn)題
這篇文章主要介紹了pycharm解決關(guān)閉flask后依舊可以訪問(wèn)服務(wù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04

