Python运行数据集加载代码报'module' object is not callable错误
问题描述
运行图像数据集加载代码时触发'module' object is not callable类型错误。已知该类错误的常见诱因为模块名称与函数名称重名,但自行排查后始终无法修复,现附上完整代码与报错信息,求排查思路与修复方案。
业务代码
def Dataset_loader(DIR, RESIZE, sigmaX=10): IMG = [] read = lambda imname: np.asarray(Image.open(imname).convert("RGB")) for IMAGE_NAME in tqdm(os.listdir(DIR)): PATH = os.path.join(DIR,IMAGE_NAME) _, ftype = os.path.splitext(PATH) if ftype == ".png": img = read(PATH) img = cv2.resize(img, (RESIZE,RESIZE)) IMG.append(np.array(img)) return IMG ben_train = np.array(Dataset_loader('D:/regionGrowing_MLT/AllSavedRGBImages/Training/Benign',224)) mal_train = np.array(Dataset_loader('D:/regionGrowing_MLT/AllSavedRGBImages/Training/Malignant',224)) ben_test = np.array(Dataset_loader('D:/regionGrowing_MLT/AllSavedRGBImages/Test/Benign',224)) mal_test = np.array(Dataset_loader('D:/regionGrowing_MLT/AllSavedRGBImages/Test/Malignant',224))
报错栈信息
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-25-0c6ae6585a38> in <module> 13 return IMG 14 ---> 15 ben_train = np.array(Dataset_loader('D:/regionGrowing_MLT/AllSavedRGBImages/Training/Benign',224)) 16 mal_train = np.array(Dataset_loader('D:/regionGrowing_MLT/AllSavedRGBImages/Training/Malignant',224)) 17 ben_test = np.array(Dataset_loader('D:/regionGrowing_MLT/AllSavedRGBImages/Test/Benign',224)) <ipython-input-25-0c6ae6585a38> in Dataset_loader(DIR, RESIZE, sigmaX) 2 IMG = [] 3 read = lambda imname: np.asarray(Image.open(imname).convert("RGB")) ----> 4 for IMAGE_NAME in tqdm(os.listdir(DIR)): 5 PATH = os.path.join(DIR,IMAGE_NAME) 6 _, ftype = os.path.splitext(PATH) ~\anaconda3\lib\site-packages\pyforest\_importable.py in __call__(self, *args, **kwargs) 47 def __call__(self, *args, **kwargs): 48 self.__maybe_import__() ---> 49 return eval(self.__imported_name__)(*args, **kwargs) 50 51 def __repr__(self, *args, **kwargs): TypeError: 'module' object is not callable
根因定位
从报错栈可以定位到错误触发点是第4行的tqdm(os.listdir(DIR))调用:
当前运行环境使用pyforest做依赖自动导入,自动导入逻辑错误地引入了tqdm模块本身,而非tqdm模块下同名的可调用进度条对象,模块本身无法被直接调用,因此抛出该类型错误。该问题本质和“自定义命名与库重名”的常见诱因一致,只是冲突来自自动导入工具的错误匹配。
修复方案
- 放弃pyforest的隐式自动导入,在代码最开头显式声明所有依赖的导入语句,这是稳定性最高的修复方式,导入代码如下:
import os import cv2 import numpy as np from PIL import Image from tqdm import tqdm
注意:tqdm必须用
from tqdm import tqdm格式导入,如果只写import tqdm,当前命名空间下的tqdm仍然是模块对象,调用时会复现相同错误。
- 额外检查当前工作目录下是否存在自定义命名为
tqdm.py的文件、或名为tqdm的文件夹,如果存在直接重命名,避免和第三方tqdm库产生命名冲突。 - 如果需要保留pyforest自动导入能力,可以将遍历行的tqdm调用修改为
tqdm.tqdm(os.listdir(DIR)),显式指定调用模块下的可调用对象,但该方式可维护性差,不推荐使用。
内容的提问来源于stack exchange,提问作者farabee
相关产品推荐
相关产品推荐

