Python OTP生成程序调用Epson热敏打印机时出现usb.core.USBError权限不足问题求助
问题分析与解决方案
核心问题根源
你遇到的usb.core.USBError: [Errno 13] Access denied错误,本质是USB打印机设备资源没有被正确释放,加上Tkinter主线程的阻塞特性,导致多次调用打印函数后,设备句柄被残留的连接占用,系统拒绝后续的访问请求。
虽然你提到单独调用打印函数正常,但在Tkinter的回调流程中,每次点击按钮都会新建一个Usb实例,却没有主动关闭/释放资源,这些残留的连接会逐渐耗尽设备的可用句柄,最终触发权限错误。
分步解决方案
1. 确保打印后正确释放USB资源
修改print_function,添加资源释放逻辑,确保每次打印完成后彻底关闭设备连接:
def print_function(password): p = Usb(0x04B8, 0x0E27, 0, 0x81, 0x02) try: p.text('mdm \n\n\n\n"OTP FOR SYSTEM IS \n\n\n "' + password) p.cut() print(password) finally: # 关闭打印机连接 p.close() # 强制清理libusb的底层资源,避免句柄泄漏 usb.util.dispose_resources(p.device)
2. 将打印操作放到子线程执行
Tkinter的所有UI回调都在主线程运行,如果打印操作阻塞主线程,会导致资源释放不及时。把打印任务放到子线程,避免阻塞UI主线程:
修改remove_line函数中的打印调用:
def remove_line(fileName): with open(fileName, 'r') as fin: data = fin.read().splitlines(True) messagebox.showinfo("Password", 'Password is:- ' + data[0]) # 使用守护线程执行打印任务,不阻塞主线程 threading.Thread(target=print_function, args=(data[0],), daemon=True).start() with open(fileName, 'w') as fout: fout.writelines(data[1:])
3. 额外的Windows权限排查
如果上述修改后仍有问题,可以尝试:
- 右键以管理员身份运行你的Python程序,避免系统级别的权限限制
- 检查Windows设备管理器中,打印机的驱动是否安装正确,确保没有其他程序占用打印机
为什么之前单独调用没问题?
当你在单独的脚本中调用打印函数时,脚本执行完成后Python进程会退出,系统会自动回收所有资源;但在Tkinter程序中,进程一直运行,残留的USB连接句柄不会被自动回收,积累几次后就会触发权限错误。
内容的提问来源于stack exchange,提问作者Narayan Chowdhari
相关产品推荐
相关产品推荐

