Python运行报错:Queue无get/put/Empty属性问题排查修复
问题根因
- 核心触发原因是自定义队列类文件名和Python标准库模块重名:你把自己实现Queue类的代码保存为
Queue.py放在项目目录下,Python导入模块时会优先加载当前工作目录的同名文件,不仅你自己写的from Queue import Queue会导错,VS2019的调试组件debugpy内部导入标准队列模块时,也会错误加载你写的自定义Queue模块,而不是Python自带的标准队列实现。 - 你自定义的Queue类只实现了
add_queue、get_queue方法,既没有调试器依赖的put(入队)、get(出队)方法,模块内也没有定义Empty空队列异常,所以调试器启动阶段就会抛出属性错误,根本还没运行到你写的业务交易处理逻辑。 - 存在版本适配错误:你当前用的是Python3.7环境,Python3的标准队列模块名是全小写的
queue,大写Queue是Python2的模块名,就算没有重名问题,你写的导包语句也会执行失败。 - 你的业务代码本身还存在多处语法、逻辑错误,就算解决重名问题也无法正常运行。
修复步骤
第一步:解决模块名冲突
- 把自定义队列类所在的文件重命名,禁止使用
Queue.py作为文件名,比如改成BankQueue.py,同时删除项目目录下的Queue.pyc缓存文件、__pycache__文件夹内所有和Queue相关的缓存文件,避免旧缓存干扰导包。 - 统一修正导包语句:
- 如果要使用Python标准库自带的队列,Python3环境下写为
from queue import Queue, Empty - 如果要导入你自己实现的自定义队列,对应改为
from BankQueue import Queue(和你重命名后的文件名保持一致)
- 如果要使用Python标准库自带的队列,Python3环境下写为
提示:如果没有特殊需求,直接用Python标准库实现的Queue即可,自带线程安全的
put()、get()方法和Empty异常,不需要自己重复实现队列逻辑。
第二步:修复业务代码的语法、逻辑bug
- 补全自定义Queue类的初始化逻辑:你当前写的
__init__方法没有初始化内部存储用的_list属性,调用入队方法时会报属性不存在错误,补全代码:
class Queue: def __init__(self): self._list = [] # 初始化内部存储列表
- 修复
add_transaction的方法调用错误:process_file()是Transaction类的实例方法,不能直接全局调用,要改为self.process_file(),否则会报函数未定义错误。 - 修复文件读取的逻辑bug:你现在把
temp = []写在了文件遍历循环外面,每读一行的元素都会累积到同一个temp列表里,导致所有交易行数据重复,要把temp初始化移到每行遍历的循环内部,同时记得关闭打开的文件:
def process_file(self): data_file = open(r"C:\Users\manga\Downloads\BankTansIn.txt", "r") for line in data_file: temp = [] # 每读一行新建一个临时列表,避免数据交叉污染 word = line.split() for element in word: temp.append(element) self._transactions_list.append(temp) data_file.close()
- 修复打印逻辑的错误:
print_queue方法里range(current_list)写法非法,range要求传入整数参数,不能直接传入列表;自定义Queue的__str__方法里写的len(list)、list[each]存在变量名错误,list是Python内置类型,要替换为你实际要遍历的curr_list变量。
修复完成后重启Visual Studio 2019,清理Python缓存后重新运行,调试器不会再抛出Queue相关属性错误,交易文件读取逻辑也能正常解析每行数据。
内容的提问来源于stack exchange,提问作者小苹果
相关产品推荐
相关产品推荐

