Python 版本选择:3.7、3.8 还是 3.9?

选 Python 版本这件事,很多人觉得无所谓。但我做了几年分子生成项目后,发现版本选不对,后面全得重来。今天就聊聊我的经验。

为什么不是越新越好?

分子生成领域有很多历史悠久的库。比如 RDKit、Open Babel、DeepChem,它们对 Python 版本的兼容性并不一致。我见过有人直接装 Python 3.10,结果 RDKit 死活装不上。嗯,后来发现官方 whl 还没跟上。

所以我的建议是:选择 Conda 生态里最稳定的 Python 版本。目前来看,Python 3.7、3.8、3.9 是主流选择。咱们一个一个拆开说。

Python 版本 发布年份 RDKit 兼容性 PyTorch 兼容性 我的推荐场景
3.7 2018 全版本(<3.10) ≤ 1.12 老旧项目、服务器环境受限
3.8 2019 全版本(<3.10) ≤ 1.13 大部分分子生成项目,我目前主力
3.9 2020 ≥2021.09 ≥ 1.11 新项目、想尝鲜但不要太激进

Python 3.7 —— 老兵不死

Python 3.7 在 2023 年已经停止安全更新了。但为什么我还会提它?因为很多老牌分子生成工具,比如 OpenBabel 2.4.1、AutoDock Vina 的某些绑定脚本,还是依赖 3.7 的 ABI。我曾经在一个合作项目里,对方的服务器只支持 3.7,我不得不降级环境。

如果你是在一个已经跑了好几年的项目上继续开发,或者部署到 CentOS 7 这类老系统,选 3.7 是安全的。

我的建议:如果新开项目,尽量别用 3.7 了。安全漏洞没人修,而且很多新库已经放弃支持。

Python 3.8 —— 我的主力版本

我个人习惯用 Python 3.8。为什么?因为它在兼容性和新特性之间找到了平衡。Python 3.8 引入了海象运算符(:=),这让代码写起来更顺手。而且 RDKit 从 2019 年开始就对 3.8 做了全面适配。

我上一个分子生成项目(基于 VAE 的分子生成)就用的 3.8。所有依赖一键装好,没出过兼容性问题。

安装命令很简单:

conda create -n molgen python=3.8
conda activate molgen

Python 3.9 —— 新项目的首选

Python 3.9 在 2020 年发布,带来了字典合并操作符、更灵活的 typing 等。对于分子生成来说,3.9 最大的好处是 性能优化——某些字符串操作快了 20% 左右。当然,这不是决定性因素。

要注意的是,RDKit 从 2021.09 版本开始才正式支持 3.9。如果你用 conda 默认源,一般没问题。但如果你用 pip 从 GitHub 装某些分叉版本,可能会遇到问题。

我曾经掉过的坑:在 3.9 下装 DeepChem 2.6.0,结果 tensorflow 2.4 和 3.9 不兼容。后来发现 DeepChem 官方文档里明确写了 Python 3.7~3.8。所以选版本前,一定要查项目的 setup.py 或 environment.yml。

怎么选?一张流程图搞定

我把决策逻辑画了出来。你跟着走一遍就知道该选哪个了。

Python 版本选择决策树 开始:分子生成项目 是否有老旧依赖(如 OpenBabel 2.4)? 是 Python 3.7 否 新项目还是维护旧项目? 是否使用 PyTorch ≥ 1.11? 否 Python 3.8(推荐) 是 Python 3.9(尝鲜) 提示:无论选哪个,先 conda create -n 虚拟环境 然后用 RDKit 的 conda 源安装,避免 pip 编译失败

版本验证:装对了没?

选好版本后,我习惯做三步验证。不验证的话,后面跑模型时出了错还要回头排查,太浪费时间。

第一步:确认 Python 版本

进入你的 Conda 环境,运行:

python --version

输出应该跟你创建时指定的一致。比如我创建了 3.8,它会显示:

Python 3.8.18

第二步:检查核心库能否导入

分子生成离不开 RDKit。我用这条命令快速验证:

python -c "import rdkit; print(rdkit.__version__)"

如果报错,说明 RDKit 没装或者版本不匹配。我建议用 Conda 安装,因为它会为你选好兼容版本。

最佳安装方式:
conda install -c conda-forge rdkit
这条命令会自动匹配当前 Python 版本。比 pip 省心十倍。

第三步:跑个简单的 RDKit 测试

写一个极简脚本,验证分子读写没问题。我在项目里常用这个:

python -c "
from rdkit import Chem
mol = Chem.MolFromSmiles('CCO')
print(Chem.MolToSmiles(mol))
"

如果输出 CCO,说明 Python 和 RDKit 已经能正常工作了。这时候你的环境基础就搭好了。

避坑指南:我遇到过的典型问题

  • 版本号冲突:曾经在 3.7 下装 PyTorch 1.13,怎么都装不上。后来才知道 PyTorch 1.11 之后就不支持 3.7 了。老老实实退回 1.10 才解决。
  • conda 源太慢:国内用户建议加清华镜像。我一般会在创建环境前先跑 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/。
  • macOS 上的架构问题:Apple Silicon(M1/M2)建议用 conda create -n molgen python=3.8 -c conda-forge,因为 default 源对 arm64 支持不太好。
小心:不要在同一个 conda 环境里同时装太多不同版本的包。比如你同时装了 RDKit 2023.03 和 OpenBabel 3.0,它们可能依赖同一个底层库的不同版本,导致 Segfault。我建议每个项目一个环境,干净利落。

小结一下

Python 版本选择这件事,说白了就是平衡兼容性和新特性。我的个人经验是:新项目无脑 Python 3.8,有老旧依赖就 3.7,想尝鲜且依赖都很新那就 3.9。验证三步走,环境就稳了。

有了稳定的 Python 版本,接下来就可以安装分子生成必备的科学计算库了。这一步做好了,后面的路才走得顺。