[Python报错] ImportError: cannot import name ‘timer’ from ‘timer’
前言
我最近遇到这个报错,卡了我好长时间去解决,我在互联网上找了很多资料,遗憾的是,我没找到有其他人遇到的类似的问题。所以在这里做一下记录。事实上,我的这种解决问题的思路适用于解决大多数类似的 cannot import name xxx 的问题。
文章目录
- 前言
- 报错信息描述
- 基础运行环境
- 报错原因分析
- 解决方案
报错信息描述
报错信息:ImportError: cannot import name 'timer' from 'timer'
报错详细信息:ImportError: cannot import name 'timer' from 'timer' (C:\Users\Administrator\AppData\Roaming\Python\Python39\site-packages\win32\timer.pyd)
报错文件:timer.pyd
报错代码:from timer import timer
我的报错完整截图:
基础运行环境
任何计算机相关的问题都不能脱离运行版本来看。
我的python运行环境如下:
- 操作系统:win11
- conda版本:22.9.0
- python版本:3.9
报错原因分析
1、首先,我们要明确:报错的地方是你自己写的python代码中,有地方写了【from timer import timer】这句话导致的报错。
下图是我的python代码示例。我创建了一个test.py。代码中只有两句话,如果正常运行将看到控制台中打印数字0:
2、然后,分析这句报错信息:从【cannot import name ‘timer’ from ‘timer’】这句话看得出来,不是没有pip install timer包的问题,因为通常来说没有安装包的报错是【ImportError: No module named xxx】;我们可以通过命令pip list
查看timer是否安装:
显然,timer包已经安装了。
3、最后,【cannot import name ‘timer’ from ‘timer’】这句话的意思是无法从timer包中导入名为timer的函数。
不是没有找到,而是找到了但却无法导入。由此,可以推断出是系统中存在两个或多个timer包并且版本不一样(或者单纯就是两个完全不同的包刚好名字都取成了timer),而优先导入的timer包中不存在timer函数。
我们再结合后面那句话【(C:\Users\Administrator\AppData\Roaming\Python\Python39\site-packages\win32\timer.pyd)】可以看出Python解释器是(优先)找到【Python39】自带的【site-packages】中的【timer.pyd】(pyd是python的编译中间文件)而不是优先找到虚拟环境的【site-packages】中的【timer.pyd】。
由此我们可以断定系统中确实存在两个【timer】。
下面是图示:
我们希望解释器使用的是虚拟环境中的【timer】:
实际上,解释器找到的却是Python39中的【timer】:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ogBnDZzr-1685016654981)(https://qyhbucket.oss-cn-shanghai.aliyuncs.com/techblog/image-20230519100232443.png)]
解决方案
将Python39自带的timer.pyd重命名掉(如:timer_rename.pyd),或者删掉(比较危险),强制使用虚拟环境中安装的timer,就可以了。
改完之后,我们重新运行test.py:
可以看到控制台成功打印了数字‘0’。
问题得到了解决~