集群运行Scanpy脚本保存h5ad文件报NoneType属性错误求助
报错根本原因
sc.pp.regress_out 属于Scanpy的预处理类函数,默认采用原地修改逻辑:直接修改传入的AnnData对象,不会返回处理后的新对象,返回值固定为None。
你的代码中将该函数的返回值赋值给adata_comb_regressed,导致该变量实际为None类型,自然不存在.write_h5ad/.write方法,触发对应的AttributeError。
本地运行时保存逻辑正常,是因为你没有接收regress_out的返回值,直接对修改后的原AnnData对象执行保存操作,符合函数的设计逻辑。
可行修复方案
方案1:遵循原地操作逻辑(推荐)
删除对regress_out返回值的赋值,函数执行完成后直接保存被原地修改的原对象即可。如果需要保留未校正的原始对象,可以在执行回归前先做副本。
修正后的核心代码段:
import numpy as np import pandas as pd import scanpy as sc import scipy adata_comb = sc.read_h5ad('/mnt/k01/ScRNA_scanpy/adata_combined.h5ad') # 如需保留原始未校正对象,可先执行 adata_comb_raw = adata_comb.copy() sc.pp.regress_out(adata_comb, ['total_counts', 'pct_counts_mt']) # 直接保存修改后的原对象 adata_comb.write_h5ad('/mnt/k01/ScRNA_scanpy/adata_comb_regressed_new.h5ad')
方案2:开启copy参数返回新对象
如果希望原对象不被修改、直接获取处理后的新对象,给regress_out传入copy=True参数即可,此时函数会复制输入对象做处理,最终返回处理完成的新AnnData对象:
adata_comb = sc.read_h5ad('/mnt/k01/ScRNA_scanpy/adata_combined.h5ad') adata_comb_regressed = sc.pp.regress_out(adata_comb, ['total_counts', 'pct_counts_mt'], copy=True) adata_comb_regressed.write_h5ad('/mnt/k01/ScRNA_scanpy/adata_comb_regressed_new.h5ad')
额外注意事项
- 你脚本首行的shebang写法有误:
#!/Users/k01/miniconda3/envs/scrna/bin/python regress_scanpy.py中不需要附带脚本文件名,正确写法为#!/Users/k01/miniconda3/envs/scrna/bin/python,否则可能出现SLURM调度时解释器识别异常的问题。 - 如果修复上述问题后运行出现内存不足报错,可适当调大SLURM参数中的
--mem值,regress_out对大单细胞矩阵的内存消耗通常高于常规预处理步骤。
内容的提问来源于stack exchange,提问作者Echo94
相关产品推荐
相关产品推荐

