导入torchtext.data.datasets_utils时出现ImportError问题求助
问题解决:torchtext导入StreamWrapper报错
问题背景
使用torch-1.12.1和torchtext-0.13.1,导入以下代码时触发ImportError:
from torch.utils.data import DataLoader from torch.nn.utils.rnn import pad_sequence import math from torch.nn import Transformer import torch.nn as nn import torch from torch import Tensor from torchtext.vocab import build_vocab_from_iterator from typing import Iterable, List from torchtext.data.datasets_utils import _RawTextIterableDataset from torchtext.data.datasets_utils import _read_text_iterator
报错信息:
ImportError: cannot import name 'StreamWrapper' from 'torch.utils.data.datapipes.utils.common'
原因分析
- 版本不兼容:
torchtext-0.13.1依赖的StreamWrapper模块位置,与torch-1.12.1中的模块结构不匹配,该类在torch的datapipes模块中存在版本间的位置变动。 - 误用私有API:
_RawTextIterableDataset和_read_text_iterator是torchtext的内部私有模块(以下划线开头),这类模块不对外公开,版本迭代时极易出现兼容性问题。
解决方案
方案1:升级torch到匹配版本
将torch升级至1.13.0及以上版本,与torchtext-0.13.1兼容:
pip install torch>=1.13.0 torchtext==0.13.1 --upgrade
方案2:改用torchtext公开API替代私有模块
避免直接调用内部私有工具,改用torchtext公开的数据集处理API。例如,替代_read_text_iterator的实现示例:
from torchtext.data.datapipes.iter import FileOpener, IterableWrapper def read_text_iterator(file_path): datapipe = IterableWrapper([file_path]) datapipe = FileOpener(datapipe, mode='r') return datapipe.readlines(decode=True, skip_empty_lines=True)
若需构建原始文本数据集,直接结合IterableDataset与上述迭代器即可,无需依赖内部的_RawTextIterableDataset。
内容的提问来源于stack exchange,提问作者David98
相关产品推荐
相关产品推荐

