Python使用PyInstaller/pip打包与发布的详细指南

 更新时间:2025年11月23日 10:25:07   作者:程序员爱钓鱼  
这篇文章主要为大家详细介绍了Python使用PyInstaller/pip打包与发布的详细指南

本篇博客从零到一带你熟悉:

  • PyInstaller:把 Python 项目打包成 EXE / APP
  • pip 包发布流程:把你的项目推向 PyPI
  • 常见坑与最佳实践

让你写的 Python 程序能真正“走出去”,触达更多真实用户。

一、使用 PyInstaller 打包可执行程序

1. PyInstaller 是什么

PyInstaller 是将 Python 程序打包成可执行文件(如 Windows 的 .exe)的最常用工具。它会把 Python 解释器 + 所有依赖打包进一个独立文件,用户无需 Python 环境即可运行。

适合场景:

  • 给用户分发桌面工具
  • 内部办公自动化脚本
  • GUI 程序(Tkinter、PyQt、wxPython 等)
  • 命令行工具

2. PyInstaller 基本使用

安装:

pip install pyinstaller

最简单的打包:

pyinstaller main.py

完成后,目录结构如下:

dist/
    main/
        main.exe
build/
main.spec

最终可执行文件就在 dist 目录里。

3. 常用参数(必须掌握)

单文件打包

pyinstaller -F main.py

优点:只生成一个 .exe 缺点:启动稍慢

隐藏控制台窗口(GUI 程序)

pyinstaller -F -w main.py

加入图标

pyinstaller -F -i icon.ico main.py

添加数据文件(图片、配置、模型)

推荐在 .spec 文件中配置:

a = Analysis(
    ...,
    datas=[('config.yml', 'config.yml'), ('assets/', 'assets/')],
)

然后:

pyinstaller main.spec

4. 打包常见问题(超实用)

(1)打包后无法运行 / 缺少模块

原因:PyInstaller 未能自动识别依赖 解决:

pyinstaller -F main.py --hidden-import xx_module

(2)打包文件太大?

解决方式:

  • 使用 UPX 压缩
  • 删除 matplotlib/numpy 中用不到的 DLL

(3)Mac 打包的 app 无法在另一台 Mac 运行

因为 macOS 的签名安全机制,建议:

  • 在目标版本系统构建(如 macOS 14)
  • 结合 codesign --deep 进行签名

二、Python 包发布到 PyPI(pip install 可用)

让别人可以:

pip install yourpackage

这是专业 Python 开发者的重要能力之一。

1. 项目结构(最推荐)

myproject/
    myproject/
        __init__.py
        core.py
    tests/
    README.md
    pyproject.toml
    LICENSE

最关键:使用 pyproject.toml(现代标准)

2. 使用 build 进行构建

安装:

pip install build twine

构建:

python -m build

生成:

dist/
    myproject-1.0.0.tar.gz
    myproject-1.0.0-py3-none-any.whl

3. 发布到 TestPyPI

避免污染正式 PyPI。

twine upload --repository testpypi dist/*

安装测试版:

pip install -i https://test.pypi.org/simple/ myproject

4. 正式发布到 PyPI

twine upload dist/*

全世界的人就都可以:

pip install myproject

5. pyproject.toml 示例(最推荐)

下面是一个专业示例,可直接复用:

[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 发布常见问题

403 权限错误

未创建 API Token 或 Token 配置错误 → 进入 pypi.org/manage/account/ 创建 Token 并更新 .pypirc

版本号冲突

PyPI 版本号不能重复 → 每次发布前更新版本号(如:1.0.1 → 1.0.2)

依赖未安装

确保 dependencies 正确写到 pyproject.toml

三、两者对比:应该用哪个

场景PyInstallerPyPI 包发布
给普通用户(没 Python 环境)✔ 最佳选择
给开发者✔✔(最推荐)
分发 GUI 工具无意义
库 / SDK 发布✔最佳

四、最佳实践总结

办公/桌面工具 → PyInstaller:稳定、方便、用户无须 Python

开发者工具 → PyPI 发布:现代 Python 项目的标准做法

推荐结合 CI 自动化发布:GitHub Actions + PyPI + build 可以做到“打 tag 自动发布”

到此这篇关于Python使用PyInstaller/pip打包与发布的详细指南的文章就介绍到这了,更多相关Python项目打包与发布内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pytorch 固定部分参数训练的方法

    pytorch 固定部分参数训练的方法

    今天小编就为大家分享一篇pytorch 固定部分参数训练的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • 使用pandas的DataFrame的plot方法绘制图像的实例

    使用pandas的DataFrame的plot方法绘制图像的实例

    今天小编就为大家分享一篇使用pandas的DataFrame的plot方法绘制图像的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python实现Dijkstra静态寻路算法

    python实现Dijkstra静态寻路算法

    这篇文章主要介绍了python实现Dijkstra静态寻路算法,常用于路由算法或者作为其他图算法的一个子模块,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Pytorch pth 格式转ONNX 格式的详细过程

    Pytorch pth 格式转ONNX 格式的详细过程

    PyTorch 训练的模型,需要在Jetson nano 上部署,jetson 原生提供了TensorRT 的支持,所以一个比较好的方式是把它转换成ONNX 格式,然后在通过ONNX 转换成TensorRT 格式,这篇文章主要介绍了Pytorch pth 格式转ONNX 格式,需要的朋友可以参考下
    2023-05-05
  • Python使用keyboard库实现键盘监听与自动化控制的实战指南

    Python使用keyboard库实现键盘监听与自动化控制的实战指南

    在自动化办公、游戏辅助、测试脚本、系统控制等场景中,我们经常需要让程序感知或模拟键盘行为,keyboard让我们能够在任意系统上轻松地监听键盘事件、模拟键盘输入,甚至实现复杂的组合键操作,本文将带你全面掌握keyboard库,从基础用法到底层原理,再到高级自动化项目实战
    2025-10-10
  • python如何统计字符串汉字数量

    python如何统计字符串汉字数量

    这篇文章主要介绍了python如何统计字符串汉字数量问题,
    2024-05-05
  • 使用pandas忽略行列索引,纵向拼接多个dataframe

    使用pandas忽略行列索引,纵向拼接多个dataframe

    这篇文章主要介绍了使用pandas忽略行列索引,纵向拼接多个dataframe的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • python之PyQt按钮右键菜单功能的实现代码

    python之PyQt按钮右键菜单功能的实现代码

    这篇文章主要介绍了python PyQt按钮右键菜单功能的实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python基础 while循环与break、continue关键字

    Python基础 while循环与break、continue关键字

    今天再带着大家讲述一下while循环。那么for循环和while循环,到底有什么区别呢?下面文章就来详细介绍,感兴趣的小伙伴可以参考一下
    2021-10-10
  • 教你使用Python画圣诞树做浪漫的程序员

    教你使用Python画圣诞树做浪漫的程序员

    这不是圣诞节快到了,还不用Python绘制个圣诞树和烟花让女朋友开心开心,也算是亲手做的,稍稍花了点心思,学会了赶紧画给你的那个她吧
    2022-12-12

最新评论