为何导入Python文件函数时出现NotImplementedType无astype属性错误?
解决从Jupyter Notebook导入自定义函数时的
AttributeError: 'NotImplementedType' object has no attribute 'astype'问题 我碰到过不少开发者遇到这个问题,核心原因其实是导入自定义模块时的执行逻辑和直接在单元格运行代码的逻辑不一样,下面分几种常见情况给你分析:
1. 你的myfile.py里有全局执行的代码,导入时触发了错误的变量赋值
这是最常见的坑!如果你的myfile.py结构是这样的:
# myfile.py import numpy as np from scipy.misc import imread # 这段代码在模块导入时会直接执行! image = imread("test_image.jpg") def myfunc(): # 使用了上面定义的全局image变量 for i in range(...): class_mask = np.equal(image, i) class_mask = class_mask.astype(np.float32) ...
当你执行from myfile import myfunc时,imread那行代码会立刻运行。如果此时Jupyter的工作目录和myfile.py所在的目录不一样,test_image.jpg找不到,旧版本的scipy.misc.imread会返回NotImplemented,导致后续np.equal得到的结果也是NotImplementedType,调用astype就报错了。而你把代码直接粘到单元格时,是在Jupyter的工作目录下读取文件,路径正确,所以image是正常的数组,自然没问题。
解决办法:
- 把所有依赖逻辑封装到函数内部,或者让函数接收参数:
# 修改后的myfile.py import numpy as np from scipy.misc import imread def myfunc(image_path): # 把读取操作放到函数里,避免全局变量问题 image = imread(image_path) for i in range(...): class_mask = np.equal(image, i) class_mask = class_mask.astype(np.float32) ... - 或者先切换Jupyter的工作目录到
myfile.py所在的文件夹:import os # 替换成你的myfile.py所在路径 os.chdir("/home/you/notebooks/your_folder") from myfile import myfunc
2. Jupyter的Python环境和myfile依赖的环境不一致
比如你用conda管理环境,Jupyter用的是A环境,而myfile.py是在B环境下写的,两者的numpy、scipy版本不匹配:
- 新版本的scipy已经移除了
scipy.misc.imread,如果Jupyter环境的scipy版本偏高,导入时这个函数会失效,可能导致image变量没被正确赋值,变成NotImplemented;而你直接在单元格运行时,可能之前已经导入了兼容的替代库(比如PIL),所以没报错。
解决办法:
- 统一环境:在Jupyter的内核选择里切换到和
myfile相同的环境。 - 替换废弃的
imread,改用更稳定的库:# 用PIL替代scipy.misc.imread from PIL import Image import numpy as np # 读取图片并转成numpy数组 image = np.array(Image.open("test_image.jpg"))
3. 你导入了错误的myfile.py
有时候系统里可能存在多个同名的myfile.py(比如Python默认库路径里有一个),你以为导入的是自己写的那个,实际却是另一个版本,里面的代码有问题导致image变成了NotImplementedType。
解决办法:
- 先检查导入的模块路径:
如果输出的不是你写的文件路径,就把你的import myfile print(myfile.__file__)myfile.py放到Jupyter的工作目录,或者把它所在的目录添加到Python路径:import sys sys.path.append("/path/to/your/myfile_folder") from myfile import myfunc
先从第一种情况排查,大概率能解决问题!
内容的提问来源于stack exchange,提问作者S.EB
相关产品推荐
相关产品推荐

