解决Python报错指南:ImportError下无法从”Y”导入名为‘X’的问题
最近又在调代码了,又又又又又遇到了“ImportError: cannot import name X from Y ”错误,显然这是在导入包时的错误,索性总结一下所有可能,以后方便查原因。
Python报这个错有很多种原因,大致如下:
- 正在导入的模块、函数、类或者要从中导入的模块的名称拼写错误。
- 在文件之间循环导入。
- 尝试导入的模块、函数或者类只有在某些库的指定版本存在,亦或者Pyhon的版本不支持某些版本的库。
- 尝试导入的模块、函数、类同名自己编写的py文件。
那么逐一给出各个原因解决办法:
1.拼写错误
如今IDE基本上都有拼写检查功能,逐一检查,类名,函数名,模块名的拼写即可。
2.循环导入
先举一个循环导入的例子:
例如这是一个“main.py”和“Fuc1.py”
# main.py:
from Fuc1 import multiply
def addition(a, b):
return a + b
print(multiply(5, 5))
# Fuc1.py
from main import addition
def multiply(a, b):
return a * b
print(addition(5, 5))
不难看出连个文件在相互调用各自的内部方法,导致程序无法正常执行,解决方法也很简单——新建一个py文件作为方法库,用于保存addition()和multiply(),这是一种很经典的项目开发储存自定义函数的方法。例如:Fuc2.py如下:
# Fuc2.py
def addition(a,b):
return a+b
def multiply(a,b):
return a*b
则main.py和fuc1.py可更改为:
# main.py
from fuc2 import multiply
print(multiply(a,b))
#fuc1.py
from fuc2 import addition
print(addition(a,b))
这样一来不仅避免循环调用问题,也是项目文件和机构更加整洁清晰。
3.版本不匹配
3.1对于一些模块的方法调用在不同的模块中的用法或者定义不同,甚至随着模块版本的更新,有些方法会被移除或者被其他方法代替,因此要确保你的想要调用的方法在你所使用的模块版本中。
3.2另外不同的python版本可能对应不同的模块版本,使用了错误的模块版本也会导致此类错误的产生。
4.自己的py文件与某些第三方库同名
例如,你将你自己项目中的某个py文件命名为numpy.py,当你想使用numpy库中的方法时,就会导致报错。
总结:
导致报错ImportError: cannot import name ‘X’ from ‘Y’,原因大致如上,希望对大家有用。
作者:可爱的三粪哥