2、环境准备:Python版本选择(3.8 vs 3.11)、虚拟环境搭建、依赖管理最佳实践
做跨平台打包,Python环境这块坑特别多。我见过太多人一上来就踩坑——版本不对、依赖冲突、虚拟环境乱成一锅粥。今天咱们就把这事彻底捋清楚。
2.1 Python版本:3.8还是3.11?
先说结论:我个人建议用Python 3.8或3.9。为什么不是最新的3.11?
你想想看,跨平台打包工具(比如PyInstaller、Nuitka、cx_Freeze)的更新速度,往往跟不上Python官方的节奏。我去年有个项目,团队里有人用了Python 3.10,结果PyInstaller死活打不出包来。查了半天,发现是某个底层hook还没适配。嗯,这种问题最让人头疼。
| Python版本 | 打包兼容性 | 我的建议 |
|---|---|---|
| 3.8 | ★★★★★ 几乎所有工具完美支持 | 首选,最稳 |
| 3.9 | ★★★★☆ 主流工具都支持 | 也可以,但个别库可能有问题 |
| 3.10 | ★★★☆☆ 部分工具需要更新 | 谨慎使用,先查兼容性 |
| 3.11 | ★★☆☆☆ 很多工具还没适配 | 不推荐用于打包项目 |
2.2 虚拟环境搭建
虚拟环境这事,说白了就是给你的每个项目一个独立的小房间。别让它们互相串门,不然依赖冲突能让你怀疑人生。
我个人习惯用venv,它是Python自带的,不用额外装东西。操作也很简单:
# 创建虚拟环境(Python 3.8为例)
python3.8 -m venv my_project_env
# 激活(Windows)
my_project_env\Scripts\activate
# 激活(macOS/Linux)
source my_project_env/bin/activate
# 退出
deactivate
为什么不用virtualenv或conda?其实都可以,但我发现很多新手在conda和pip之间切换时,容易搞混包的管理方式。用venv最纯粹,pip install就完事了,少一层心智负担。
.venv文件夹作为虚拟环境。这样一眼就能看出来这个项目有没有独立环境。而且很多IDE(比如VS Code)会自动识别这个文件夹。
2.3 依赖管理最佳实践
依赖管理这块,我见过最惨的案例是:项目跑得好好的,换台电脑就崩了。为什么?因为依赖版本没锁死。
我的做法是这样的:
- 用requirements.txt锁版本——别只写包名,要带上具体版本号
- 分环境管理——开发、测试、生产用不同的依赖文件
- 定期更新——别一锁死就再也不管了
来看一个实际例子:
# requirements-base.txt(基础依赖)
PyInstaller==5.13.2
setuptools==68.2.2
# requirements-prod.txt(生产环境)
-r requirements-base.txt
numpy==1.24.3
pandas==2.0.3
opencv-python==4.8.1.78
# requirements-dev.txt(开发环境)
-r requirements-prod.txt
pytest==7.4.3
black==23.11.0
flake8==6.1.0
这样分层的好处很明显:生产环境只装必要的包,开发环境再加调试工具。打包的时候,只用生产环境的依赖,生成的exe体积能小不少。
核心原则:打包时用的依赖,必须和生产环境完全一致。我曾经因为开发环境和打包环境差了0.1个版本,结果打出来的包在客户机器上跑出了诡异的bug。查了两天才发现是某个库的微调版本改了行为。
2.4 我的日常工作流
说了这么多,给你看看我实际是怎么操作的:
# 1. 创建项目目录
mkdir cross_platform_app
cd cross_platform_app
# 2. 创建虚拟环境(指定Python 3.8)
python3.8 -m venv .venv
# 3. 激活环境
source .venv/bin/activate # Windows用 .venv\Scripts\activate
# 4. 安装依赖
pip install -r requirements-prod.txt
# 5. 验证环境
pip list # 看看装了哪些包,版本对不对
# 6. 开始打包
pyinstaller --onefile main.py
这套流程我用了好几年,基本没出过环境相关的问题。你想想看,如果每次都在干净的环境里操作,依赖冲突的概率能降到多低?
2.5 总结一下
环境准备这事,说白了就三句话:
- 版本选3.8——兼容性最好,别追新
- 虚拟环境必须用——每个项目独立,互不干扰
- 依赖锁版本——requirements.txt写清楚,别偷懒
做到这三点,你的跨平台打包之路就少了一半的坑。下一章咱们聊聊打包工具的选择——PyInstaller、Nuitka、cx_Freeze到底该用哪个?到时候我会分享一些实际项目的对比数据。