pyCharm2020.1 'No module named dom' 无法导入 xml.dom 的问题

问题背景(废话)

听说 2020.1 版本官方支持了中文,所以果断更新了最新的2020.1版本(结果发现只有 IDEA 的新版本有中文),然而一个导入了 xml.dom 的测试程序突然报错了。这个程序很简单甚至没有导入其他包,且更新之前程序完全没有问题,因此基本可以确定问题出在 IDE 上。
此篇也是我第一次在 CSDN 上分享经验,由于问题比较简单,没有做太多整理,将查找错误的过程直接记录下来

问题描述

上一段基本已经写明,代码本身应该没有问题,贴出导入部分的代码:

import xml.dom.minidom as xmldom
from xml.dom import Node
# 在 dom 及 Node 下方都有红色波浪线报错

其中第一行的 dom 下的报错信息为:‘No module named dom’
但即使存在这个报错信息,程序依然能正常运行 。理论上可以忽略这两行报错继续使用,但一个代码洁癖症患者并不能容忍这个报错继续存在,且后续此包中相关的方法都没有自动补全,懒人表示十分不舒适,决定尝试解决这个问题。

解决过程

尝试安装相关包

通常来说这种问题都是没有安装相关的模块造成的,使用 pip 安装或在 pyCharm 中进行设置都可以方便的解决。因此我首先怀疑新的 IDE 中未自带 xml 包,但点击报错信息下提供的安装 dom 包按钮后,虽显示 dom 包安装成功,但错误信息仍然存在。
考虑到 dom 是 xml 包的一部分,智障 IDE 可能直接给我找了个叫做 dom 的包装上了(实际也很可能就是这样),因此接下来考虑安装 xml 包,但在设置中并不能找到名称为 ‘xml’ 的包,原因推测为:xml 包是 python 解释器集成的,因此不单独提供。
此处还犯了一个错误,在 IDE 提供的其他选项里,选择了忽略 dom 包的问题,点选后两个 dom 的报错都看不见了,对后续的问题查找造成了一定障碍。

尝试重启电脑、重启IDE

小白都会的基础操作,在直接解决问题未果时无脑先怼上,而事实证明无脑操作对于问题解决没啥大用。

重装 python 解释器

第一步中考虑到 xml 包是解释器中自带的,怀疑是 IDE 安装过程中误伤到 python 解释器,故重装解释器,报错仍然存在。

检查 python 解释器中的 xml 包

重新检查报错信息发现,xml 模块可以正常导入,xml 的其他三个子模块 sax, parsers, etree 也可以正常导入,唯独 dom 模块无法正常导入,故怀疑解释器中 xml 包的内容部分缺失。在 python 解释器的安装位置找到 xml 包的文件夹,手动检查相关代码,发现并不存在代码缺失的问题,__init__.py 中也没有漏写 dom
使用 VSCode 测试 pyCharm 报错的代码,一切正常,说明 python 解释器没有问题,问题只可能在 IDE 中。

重装 pyCharm

将问题锁定在 IDE 中后,重装 2020.1 版本,安装时没有继承之前版本的设置文件,重装后问题依然存在。

最终解决

由于重装时没有使用之前的设置,故能再次看到 dom 的报错信息,发现两行 dom 的报错信息并不相同

# 第一种调用方式为:
import xml.dom.minidom
# 报错为:"No module named dom"

# 第二种调用方式为:
from xml.dom import Node
# 报错为:"Cannot find reference 'dom' in '__init__.pyi' "

IDE 提示我在 __init__.pyi 文件中添加 dom 方法,于是我打开了这个文件,发现其路径在 D:\Program Files\JetBrains\PyCharm Community Edition 2020.1\plugins\python-ce\helpers\typeshed\stdlib\2and3\xml,而此文件夹下有 sax, parsers, etree 三个子文件夹,唯独没有 dom
从 python 解释器下的 xml 包中复制了 dom 文件夹到上述位置,问题解决

进一步探究

出错的位置

从上述路径来看,这个文件夹应该属于 pyCharm 中一个名叫 python-ce 的插件,但在设置的插件列表中并没有找到这个插件,由于本人的时间及水平有限,没有在此方向上继续探索。

调用语句不同导致报错信息不同

还是刚才那段代码:

# 第一种调用方式为:
import xml.dom.minidom
# 报错为:"No module named dom"

# 第二种调用方式为:
from xml.dom import Node
# 报错为:"Cannot find reference 'dom' in '__init__.pyi' "

这种差异涉及两种调用方式的区别,其具体原因可再作研究,也欢迎各位讨论指点。

发布了1 篇原创文章 · 获赞 0 · 访问量 15

猜你喜欢

转载自blog.csdn.net/weixin_42551448/article/details/105499057