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 ★★☆☆☆ 很多工具还没适配 不推荐用于打包项目
⚠️ 我曾经踩过的坑:用Python 3.11打包一个用了pandas和numpy的项目,结果生成的exe在Windows 7上直接崩溃。后来发现是3.11的某些底层API变了,导致打包后的二进制文件不兼容旧系统。从那以后,我所有打包项目都老老实实用3.8。

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 依赖管理最佳实践

依赖管理这块,我见过最惨的案例是:项目跑得好好的,换台电脑就崩了。为什么?因为依赖版本没锁死。

我的做法是这样的:

  1. 用requirements.txt锁版本——别只写包名,要带上具体版本号
  2. 分环境管理——开发、测试、生产用不同的依赖文件
  3. 定期更新——别一锁死就再也不管了

来看一个实际例子:

# 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

这套流程我用了好几年,基本没出过环境相关的问题。你想想看,如果每次都在干净的环境里操作,依赖冲突的概率能降到多低?

⚠️ 特别注意:别在系统Python里直接装包!我见过有人图省事,直接在系统环境里pip install,结果后来升级系统Python版本时,一堆包全废了。虚拟环境就是你的保险,别省这一步。

2.5 总结一下

环境准备这事,说白了就三句话:

  • 版本选3.8——兼容性最好,别追新
  • 虚拟环境必须用——每个项目独立,互不干扰
  • 依赖锁版本——requirements.txt写清楚,别偷懒

做到这三点,你的跨平台打包之路就少了一半的坑。下一章咱们聊聊打包工具的选择——PyInstaller、Nuitka、cx_Freeze到底该用哪个?到时候我会分享一些实际项目的对比数据。