4. 环境搭建:Python环境、RDKit安装、验证、虚拟环境管理

搞化学信息学,第一步该做什么?

我的答案是——先把环境搭明白。

这可不是套话。我见过太多人在代码跑了一半才发现依赖冲突,然后痛苦地重装整个Python。说实话,这事我干过不止一次。所以这次咱们把话说在前头:花半小时搞好环境,后面能省你三天时间。

4.1 为什么非要先折腾环境?

Python好装,但把RDKit装好、装对、装稳,没那么简单。

RDKit背后是C++写的底层化学算法。它不像纯Python库那样pip一下就能跑。你想想看,如果依赖的Boost版本不对,或者编译器位数不匹配,那import rdkit的时候就会给你抛出一堆看不懂的错误。

我之前带过一个实习生,他在Windows上直接pip install rdkit,结果报错折腾了一整天。后来我让他用conda装,十分钟搞定。原因是什么?RDKit官方推荐的就是conda,因为conda能处理好那些C++依赖。

环境搭建的核心目标:

  • 一个干净的Python环境——不和其它项目打架
  • RDKit正确安装——能import,能跑,不出Segment Fault
  • 测试通过——确认核心功能都能用

4.2 Python环境选择:我为什么推荐Miniconda

Python环境管理工具有很多。virtualenv、pipenv、poetry……但做化学信息学,我个人习惯用Miniconda。

原因很简单:conda不只是管Python包,它还能管非Python的依赖库。RDKit底层依赖的Boost、NumPy、Pandas这些,conda都能帮你一次性解决好版本问题。

提示:Miniconda是Anaconda的精简版,只包含conda和Python,没有那些你用不上的预装包。小、快、干净,适合我们这种需要精确控制环境的人。

如果你还没装Miniconda,去官网下载对应系统的安装包。

装好之后验证一下:

conda --version

能看到版本号,就算装好了。

特别提醒:安装时如果问你要不要初始化conda,选yes。不然你得手动配置PATH,麻烦。

4.3 创建虚拟环境:给RDKit一个单独的房间

我不建议大家把RDKit装到base环境里。原因很简单——base环境是conda自带的,万一你搞乱了,整个conda都可能出问题。

我习惯新建一个环境,专门做化学信息学项目用。

conda create -n chem_env python=3.10

这条命令的意思:创建一个名叫chem_env的虚拟环境,Python版本指定为3.10。

为什么要用3.10?因为我试过,3.10和RDKit兼容性最好,而且Python 3.10之后的一些新特性写起来确实顺手。

创建完成后,激活这个环境:

conda activate chem_env

你会看到命令行前面多了个(chem_env),这就说明你已经进到这个独立环境里了。

一个小技巧:我习惯把环境名起得有意义。比如chem_env、smiles_clean、ml_work这种,一看就知道干什么用的。别起test1、test2,后面你自己都分不清哪个是哪个。

4.4 安装RDKit:两种方法,我告诉你哪种靠谱

老生常谈的问题:RDKit到底该怎么装?

网上有说pip装的,有说源码编译的,也有说用conda装的。我自己三种都试过,结论如下:

安装方式 耗时 成功率 推荐度
pip install rdkit 几分钟 低(容易遇到C++编译问题) 不推荐
手动编译源码 半小时以上 看缘分 除非你是RDKit开发者
conda install -c conda-forge rdkit 几分钟 接近100% 强烈推荐

看到了吧?conda是最省心的。我在Windows、macOS、Linux上都试过,没出过问题。

具体命令:

conda install -c conda-forge rdkit

加-c conda-forge的意思是告诉conda去conda-forge这个频道下载。conda-forge是社区维护的频道,更新快,包也全。RDKit官方就推荐从这个频道装。

避坑指南:我曾经试过用defaults频道装RDKit,结果装了老的2020版本,很多新功能没有。conda-forge里的RDKit通常是最新的。所以,老老实实用conda-forge。

4.5 验证安装:确认RDKit能正常工作

装完了别急着走。验一下,确保真的能用。

我一般三步走:

  1. 检查导入——看有没有ImportError
  2. 检查版本——看版本号对不对得上预期
  3. 跑个简单测试——确认基本功能正常

在刚刚激活的环境里,运行Python:

python

然后依次输入:

from rdkit import Chem
print(Chem.__version__)

能看到版本号,比如2024.03.1,就说明装成了。

再测一个基础功能,画一个分子:

from rdkit.Chem import Draw
mol = Chem.MolFromSmiles('CCO')
print(mol.GetNumAtoms())
# 应该输出 3

如果输出是3,恭喜你,RDKit环境搭好了。

提醒一下:如果你在Jupyter Notebook里用RDKit,记得安装ipykernel:

conda install ipykernel
python -m ipykernel install --user --name chem_env --display-name "ChemEnv"

这样你的Jupyter里就能找到这个环境了。

4.6 虚拟环境管理:几个常用操作

做项目时间长了,你会创建好几个环境。怎么管理它们?下面是我经常用的命令:

# 查看本地所有环境
conda env list

# 导出当前环境的依赖列表
conda list > requirements.txt

# 从文件恢复环境
conda create -n new_env --file requirements.txt

# 删除一个环境
conda remove -n chem_env --all

# 复制环境
conda create -n chem_env_backup --clone chem_env

个人经验:每做一个重要项目之前,我都导出一份requirements.txt存着。万一环境崩了,直接重建,十分钟恢复原样。相信我,这习惯能救你很多次。

4.7 整个流程一览

把上面说的串起来,完整流程如下:

# 第一步:安装Miniconda(如已安装则跳过)
# 官网下载安装包

# 第二步:创建并有虚拟环境
conda create -n chem_env python=3.10
conda activate chem_env

# 第三步:安装RDKit
conda install -c conda-forge rdkit

# 第四步:验证
python -c "from rdkit import Chem; print(Chem.__version__)"

看到版本号,就说明一切正常。

4.8 常见问题与解决

  • 问题:conda install时进度条卡住
    • 解决:换个网络或者换国内镜像。比如清华的conda镜像:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
  • 问题:import rdkit时报错“DLL load failed”
    • 解决:大概率是Python位数和RDKit不匹配。所有组件都用64位。
  • 问题:conda命令找不到
    • 解决:添加conda到PATH,或者重新安装时选择“Add to PATH”。

重要提醒:千万不要在base环境里pip install rdkit。如果装了,先删掉。然后退出base,用conda新建环境再装。我见过有人base环境被搞乱了,最后花了半天重装整个conda。

4.9 本章知识图谱

下面这张图能帮你理清整个环境搭建的工作流:

环境搭建核心工作流 1. 操作系统 2. 安装 Miniconda 3. 创建虚拟环境 (conda create) 4. 安装 RDKit (conda-forge) 5. 验证安装 说明 每个步骤不可跳过, 顺序不要乱。 关键点 用 conda-forge 不要用 pip

看完这张图,你应该清楚了:从操作系统开始,装Miniconda,建虚拟环境,安装RDKit,最后验证。每一步都有它的道理。跳过任何一步,都可能在后面踩坑。

最终测试:

如果你能成功运行下面的代码段并看到版本号,那环境搭建这一步,你就彻底通关了。

from rdkit import Chem
from rdkit.Chem import Draw, Descriptors
from rdkit import __version__
print(f"RDKit 版本: {__version__}")