py2app
更新: 4/8/2026 字数: 0 字 时长: 0 分钟
py2app 是 macOS 下将 Python 脚本(如 PyQt、Tkinter、pywebview 等 GUI 应用)打包为原生 .app 应用的官方工具,适合纯 Python 项目分发。
1. 安装
建议用 pip 安装:
bash
pip install py2app2. 基本用法
- 准备你的主程序(如 main.py)
- 新建 setup.py 配置文件
- 运行 py2app 打包命令
3. setup.py 配置示例
python
from setuptools import setup
APP = ['main.py'] # 主程序入口
DATA_FILES = ['icon.icns', 'config.json'] # 需包含的资源文件
OPTIONS = {
'argv_emulation': True, # 支持命令行参数
'iconfile': 'icon.icns', # 应用图标
'packages': ['requests'], # 额外依赖包
'includes': [], # 强制包含的模块
'excludes': [], # 排除的模块
'resources': ['assets'], # 额外资源文件夹
'plist': {
'CFBundleName': 'YourAppName',
'CFBundleShortVersionString': '1.0.0',
'CFBundleIdentifier': 'com.example.yourapp',
'NSHighResolutionCapable': True, # 支持 Retina 屏
},
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)4. 打包命令
bash
python setup.py py2app- 生成的 .app 在 dist/ 目录下,可直接运行或配合 dmgbuild 打包 DMG
5. 资源文件与依赖打包技巧
data_files可指定单个文件或 (目标目录, [文件列表]) 形式批量添加resources可递归包含整个文件夹(如 assets、static)- 如需包含非 Python 文件(如图片、字体、配置),建议统一放在 resources 文件夹
includes/excludes可强制包含/排除特定模块,解决自动分析遗漏问题
6. 常见问题与解决方法
- 依赖丢失:如遇第三方库未被打包,需在 OPTIONS['packages'] 或 'includes' 中手动添加
- 图标不显示:iconfile 路径需为 .icns 格式,且文件存在
- 中文路径问题:建议避免中文路径和文件名
- PyQt/Matplotlib 等 C 扩展兼容性:如遇启动崩溃,尝试在 setup.py 中添加 'frameworks': ['QtCore', 'QtGui', ...]
- Apple Silicon 适配:建议在目标架构下打包,或用通用 Python 解释器(如 miniforge、官方 universal2)
- 应用沙盒/权限:如需访问网络、文件系统等,需在 plist 中声明相关权限
- 启动慢/首次运行卡顿:py2app 打包的 .app 首次运行会解压依赖,属正常现象
7. 自动化打包脚本片段
可用 shell 脚本自动化打包流程:
bash
#!/bin/bash
python3 setup.py py2app
cp -r assets dist/YourAppName.app/Contents/Resources/
# 可选:用 dmgbuild 打包 DMG
# dmgbuild -s settings.py "YourAppName" YourAppName.dmg8. 与 PyInstaller/dmgbuild 区别
- py2app 生成 .app,适合 macOS 原生体验,配置灵活
- PyInstaller 跨平台,支持更多依赖和复杂场景
- dmgbuild 仅用于将 .app 或文件夹打包为 DMG 安装镜像