服务器里边创建了两个虚拟环境,一个虚拟环境 R4.1.2 中 python 版本是 python3.7,另外一个虚拟环境 scenic 中 python 是 python3.8。
scanpy 需要调用 sklearn 模块,又叫 scikit-learn。之前在 R4.1.2 虚拟环境中安装 scanpy 也发生同样报错,但报错位置是 igraph,已经解决。在 R4.1.2 虚拟环境中可以成功导入 sklearn,但在 scenic 虚拟环境中发生报错,如下:
conda activate scenic
python3.8
import sklearn
# 命令日志
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/hanjiangang/anaconda3/envs/scenic/lib/python3.8/site-packages/sklearn/__init__.py", line 83, in <module>
from .utils._show_versions import show_versions
File "/home/hanjiangang/anaconda3/envs/scenic/lib/python3.8/site-packages/sklearn/utils/_show_versions.py", line 12, in <module>
from ._openmp_helpers import _openmp_parallelism_enabled
# 报错位置 sklearn
ImportError: dlopen: cannot load any more object with static TLS
这个报错很多人都会遇到,一般是模块导入顺序的问题,但非常难以排除到底是哪些个模块的基加载顺序问题,而且有时候是版本问题。
尝试把 R4.1.2 虚拟环境中 sklearn 相关文件复制到 scenic 虚拟环境对应的文件夹下,不出意外没法解决问题。
又尝试了下边的办法,解决问题,但不确定是具体哪一环节解决的问题。
在 R4.1.2 虚拟环境的 python3.7 中导入 sklearn,查看版本和依赖包信息
conda activate R4.1.2
python3.7
import sklearn
sklearn.show_versions()
# 命令日志
/home/hanjiangang/anaconda3/envs/R4.1.2/lib/python3.7/site-packages/_distutils_hack/__init__.py:30: UserWarning: Setuptools is replacing distutils.
warnings.warn("Setuptools is replacing distutils.")
System:
python: 3.7.12 | packaged by conda-forge | (default, Oct 26 2021, 06:08:21) [GCC 9.4.0]
executable: /home/hanjiangang/anaconda3/envs/R4.1.2/bin/python3.7
machine: Linux-2.6.32-504.el6.x86_64-x86_64-with-redhat-6.6-Santiago
Python dependencies:
pip: 22.1.2
setuptools: 62.3.3
sklearn: 1.0.2
numpy: 1.21.6
scipy: 1.7.3
Cython: 0.29.33
pandas: 1.3.5
matplotlib: 3.5.3
joblib: 1.2.0
threadpoolctl: 3.1.0
Built with OpenMP: True
根据输出信息,将 sklearn 和依赖包安装到指定版本
# scikit-learn
conda install -c esri scikit-learn
# 其他依赖包
pip install --upgrade 'setuptools == 62.3.3'
pip install --upgrade 'scipy == 1.7.3'
pip install --upgrade 'numpy ==1.21.6'
pip install --upgrade 'Cython == 0.29.33'
pip install --upgrade 'pandas == 1.3.5'
pip install --upgrade 'matplotlib == 3.5.3'
pip install --upgrade 'joblib == 1.2.0'
pip install --upgrade 'threadpoolctl == 3.1.0'
模块导入顺序,未报错
import scenicplus
import sklearn
import igraph # 后边会调用,但再次加载会出现 TLS 报错,所以需要在前边加载
import sys
import os
import scanpy as sc
numba 报错 SystemError: initialization of _internal failed without raising an exception
javaaaaaaaaa:
构建绵羊(非常见物种)BSgenome参考基因组
鲜衣怒马: