You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:12:40