如何修复解析torch版本返回None触发的TypeError报错
问题说明
Windows 11 + Python 3.9.7 [MSC v.1916 64 bit (AMD64)]环境下,测试torch 1.10.2、torch 1.11.0两个版本时,执行version.parse(importlib_metadata.version("torch"))返回None,触发如下报错:
Traceback (most recent call last): File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\IPython\core\interactiveshell.py", line 3457, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-1-c243c65504c9>", line 1, in <module> version.parse(importlib_metadata.version("torch")) File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\packaging\version.py", line 49, in parse return Version(version) File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\packaging\version.py", line 264, in __init__ match = self._regex.search(version) TypeError: expected string or bytes-like object
导入bertopic等依赖torch的第三方库时,会在transformers的依赖检查逻辑中触发相同错误,完整栈如下:
Traceback (most recent call last): File "<frozen importlib._bootstrap>", line 1007, in _find_and_load File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 680, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 850, in exec_module File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\bertopic\__init__.py", line 1, in <module> from bertopic._bertopic import BERTopic File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\bertopic\_bertopic.py", line 31, in <module> from bertopic.backend._utils import select_backend File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\bertopic\backend\__init__.py", line 2, in <module> from ._word_doc import WordDocEmbedder File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\bertopic\backend\_word_doc.py", line 4, in <module> from bertopic.backend._utils import select_backend File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\bertopic\backend\_utils.py", line 2, in <module> from ._sentencetransformers import SentenceTransformerBackend File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\bertopic\backend\_sentencetransformers.py", line 3, in <module> from sentence_transformers import SentenceTransformer File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\sentence_transformers\__init__.py", line 3, in <module> from .datasets import SentencesDataset, ParallelSentencesDataset File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\sentence_transformers\datasets\__init__.py", line 3, in <module> from .ParallelSentencesDataset import ParallelSentencesDataset File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\sentence_transformers\datasets\ParallelSentencesDataset.py", line 4, in <module> from .. import SentenceTransformer File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\sentence_transformers\SentenceTransformer.py", line 11, in <module> import transformers File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\transformers\__init__.py", line 30, in <module> from . import dependency_versions_check File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\transformers\dependency_versions_check.py", line 17, in <module> from .utils.versions import require_version, require_version_core File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\transformers\utils\__init__.py", line 33, in <module> from .generic import ( File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\transformers\utils\generic.py", line 28, in <module> from .import_utils import is_flax_available, is_tf_available, is_torch_available, is_torch_fx_proxy File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\transformers\utils\import_utils.py", line 350, in <module> torch_version = version.parse(importlib_metadata.version("torch")) File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\packaging\version.py", line 49, in parse return Version(version) File "C:\ProgramData\Anaconda3\envs\SentiAnalysis\lib\site-packages\packaging\version.py", line 264, in __init__ match = self._regex.search(version) TypeError: expected string or bytes-like object
报错原因
报错核心是version.parse()接收到的入参为None,不符合函数要求的字符串/字节类型入参。
该场景下importlib_metadata.version("torch")返回None只有两个常见诱因:
- 环境内
importlib_metadata版本过高(5.x及以上),和1.10.x、1.11.x系列旧版torch的元数据格式不兼容,无法正常读取版本号 - torch安装过程中断或源文件损坏,缺失了存储版本信息的dist-info元数据文件
修复方案
按优先级尝试以下操作:
- 降级
importlib_metadata到兼容版本
激活SentiAnalysisconda环境,执行命令:
降级完成后,先在交互环境执行pip install importlib_metadata==4.13.0importlib_metadata.version("torch"),确认返回类似1.10.2的正常版本字符串后,再导入相关依赖即可。 - 降级无效时重装torch修复元数据
先彻底卸载现有torch:
卸载完成后重新安装对应版本的torch,安装完成后先验证版本读取正常,再运行业务代码。# pip安装的torch执行该命令卸载 pip uninstall -y torch # conda安装的torch执行该命令卸载 conda remove -y pytorch torchvision torchaudio pytorch-cuda - 紧急临时绕过方案
若需要快速恢复业务运行,可直接修改依赖代码跳过版本检查:
找到报错路径下的transformers/utils/import_utils.py文件,定位到350行附近的代码:
注释原代码,手动指定当前安装的torch版本:torch_version = version.parse(importlib_metadata.version("torch"))
该修改会在transformers包升级后被覆盖,仅适合临时救急使用。# 替换为实际安装的torch版本号 torch_version = version.parse("1.11.0")
内容的提问来源于stack exchange,提问作者YNR
相关产品推荐
相关产品推荐

