You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集群运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:15:46