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

如何导入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:27:05