pySCENIC环境搭建踩坑实录:从Python 3.10到3.7的血泪回退
在进行单细胞转录因子调控网络分析(如pySCENIC)时,环境搭建往往是最让人头疼的一步。今天分享我在创建Python 分析环境并尝试加载scanpy时遇到的各种报错,以及最终成功运行的解决方案,希望能为同样在坑里的同行提供一些参考。


创建分析环境
起初我打算使用较新的Python 3.10环境,于是依次执行了以下命令:
conda create -y -n pyscenic python=3.10 conda activate pyscenic conda install -y numpy conda install -y -c anaconda cytoolz conda install -y scanpy
看似一切顺利,但在加载scanpy时便迎来了第一波报错。
Python 3.10下的典型报错
执行以下代码:
import scanpy as sc
结果控制台疯狂输出警告与错误信息,部分警告如下:
/opt/conda/lib/python3.10/site-packages/loompy/view_manager.py:23: SyntaxWarning: "is not" with a literal. Did you mean "!="? ... FutureWarning: Importing read_csv from `anndata` is deprecated. Import anndata.io.read_csv instead. ... TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
最致命的一条是:
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
这意味着scanpy内部类继承结构在Python 3.10的metaclass检查中不兼容。问题通常与matplotlib的内部类定义方式有关。
降级至Python 3.8,仍未幸免
为保险起见,我重新创建了Python 3.8环境:
conda create -y -n pyscenic python=3.8 conda activate pyscenic conda install -y scanpy
然而执行同样的导入语句:
import scanpy as sc
依旧出现了同样的metaclass conflict错误。
由此推测,这并非Python版本独有问题,而是特定版本的scanpy、matplotlib或anndata之间存在兼容性冲突。
最终解决方案:回退至Python 3.7
在多次尝试后,我决定进一步回退到Python3.7,并重新安装依赖:
conda create -y -n pyscenic python=3.7 conda activate pyscenic conda install -y numpy scanpy loompy
再次运行代码:
import loompy as lp import numpy as np import scanpy as sc x = sc.read_csv("matrix.csv") row_attrs = {"Gene": np.array(x.var_names)} col_attrs = {"CellID": np.array(x.obs_names)} lp.create("matrix.loom", x.X.transpose(), row_attrs, col_attrs)
这一次,程序顺利执行,matrix.loom文件成功生成。
总结与经验
pySCENIC及scanpy对Python版本敏感,推荐使用Python 3.7或3.8。
如果出现metaclass conflict错误,大多与matplotlib、scanpy的继承关系不兼容有关,可尝试降低版本:
pip install matplotlib==3.5.3 scanpy==1.9.1
建议使用独立conda环境管理分析流程,避免与系统Python环境冲突。
若仅需矩阵格式转换,可单独调用loompy进行.csv→.loom转换,无需完整安装pySCENIC。

浙公网安备 33010602011771号