如何导入Python MNE包中未对外导出的类、函数等成员
MNE Python自定义Raw类开发解决方案
针对你的需求,Python中可以按以下方式实现:
导入规则说明
Python中没有强制限制访问包的内部私有成员,单下划线开头的命名只是社区约定的「内部实现,不保证跨版本兼容」标识,不需要像JS那样手动查找依赖包的物理路径,只要MNE已经正确安装在你的环境中,直接从函数实际所在的模块路径导入即可。
你需要的几个成员正确导入方式如下:
from mne import RawArray, BaseRaw, verbose, logger # 内部工具函数统一存放在mne.utils模块下 from mne.utils import _validate_type, _check_option
注意事项
- 内部私有API没有官方兼容性承诺,升级MNE版本可能出现函数改名、删除等问题,建议锁定项目依赖的MNE版本
- 如果不想依赖内部API,也可以直接把
_validate_type、_check_option两个函数的官方实现复制到你的本地代码中使用
现有代码问题修正
你贴出的代码有几处明显错误,需要调整后才能正常运行:
- 注释掉了
dtype变量的定义,后续代码直接引用会触发NameError super()调用参数错误,继承自BaseRaw却传入了RawArray作为父类参数- 自定义的文件写入逻辑错误,Raw类实例不能直接通过文件句柄写入,应该调用MNE内置的save方法
- 测试用的test.txt写入逻辑属于调试代码,建议移除
修正后完整代码
import mne import numpy as np from mne import RawArray, BaseRaw, verbose, logger from mne.utils import _validate_type, _check_option def save(original_file_path, new_file_path, channels, compress=True, overwrite=False): original_raw = mne.io.read_raw(original_file_path, preload=True) info = original_raw.info new_info = info.copy() new_raw = CustomRawArray(channels, new_info) # 调用MNE内置的save方法,支持压缩和覆盖参数 new_raw.save(new_file_path, compress=compress, overwrite=overwrite) class CustomRawArray(BaseRaw): @verbose def __init__(self, data, info, first_samp=0, copy='auto', verbose=None): # noqa: D102 _validate_type(info, 'info', 'info') _check_option('copy', copy, ('data', 'info', 'both', 'auto', None)) dtype = np.complex128 if np.any(np.iscomplex(data)) else np.float64 orig_data = data data = np.asanyarray(orig_data, dtype=dtype) if data.ndim != 2: raise ValueError('Data must be a 2D array of shape (n_channels, ' 'n_samples), got shape %s' % (data.shape,)) if len(data) != len(info['ch_names']): raise ValueError('len(data) (%s) does not match ' 'len(info["ch_names"]) (%s)' % (len(data), len(info['ch_names']))) assert len(info['ch_names']) == info['nchan'] if copy in ('auto', 'info', 'both'): info = info.copy() if copy in ('data', 'both'): if data is orig_data: data = data.copy() elif copy != 'auto' and data is not orig_data: raise ValueError('data copying was not requested by copy=%r but ' 'it was required to get to double floating point ' 'precision' % (copy,)) logger.info('Creating RawArray with %s data, n_channels=%s, n_times=%s' % (dtype.__name__, data.shape[0], data.shape[1])) super().__init__(info, data, first_samps=(int(first_samp),), dtype=dtype, verbose=verbose) logger.info(' Range : %d ... %d = %9.3f ... %9.3f secs' % ( self.first_samp, self.last_samp, float(self.first_samp) / info['sfreq'], float(self.last_samp) / info['sfreq'])) logger.info('Ready.')
内容的提问来源于stack exchange,提问作者Michael Paccione
相关产品推荐
相关产品推荐

