Python模块导入报错:AttributeError与NameError问题排查
Python模块导入报错原因及解决方法
第一个报错:import converter后出现AttributeError: module 'converter' has no attribute 'lbs_to_kg'
可能原因:
- converter.py文件里的函数定义有误:比如函数名拼写错误(比如写成
lbs_to_kgs)、函数没有正确缩进(导致函数不属于模块顶层),或者文件里根本没正确定义这两个函数 - 运行app4.py时的工作目录不对,导致导入的不是你写的那个converter.py(比如当前工作目录是上级目录,而converter.py在子目录里)
- 同目录下的
__pycache__文件夹里缓存了旧的模块文件,导致导入的是旧版本
解决办法:
- 打开converter.py,检查函数定义是否正确,比如确保代码是类似这样的:
def lbs_to_kg(weight): return weight * 0.453592 def kg_to_lbs(weight): return weight / 0.453592
- 确认converter.py和app4.py在同一个文件夹下,并且运行app4.py时的工作目录就是这个文件夹。可以在app4.py开头加一行代码查看当前工作目录:
import os print(os.getcwd())
如果输出的路径不是两个文件所在的目录,就切换到对应目录再运行脚本。
3. 删除同目录下的__pycache__文件夹,然后重新运行app4.py
第二个报错:from converter import *后出现NameError: name 'converter' is not defined
原因:
用from converter import *的写法是把converter模块里的所有可导入对象(比如你定义的两个函数)直接导入到当前脚本的命名空间里,所以你不能再用converter.lbs_to_kg这种带模块前缀的方式调用函数——当前命名空间里根本没有converter这个模块对象,自然会报错。
解决办法:
- 直接用函数名调用:比如
print(lbs_to_kg(100)),不需要加converter.前缀 - 如果想保留模块名的调用方式,就改用
import converter(或者import converter as cv简化名称),然后用converter.lbs_to_kg(100)调用函数
内容的提问来源于stack exchange,提问作者etotoja
相关产品推荐
相关产品推荐

