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

Python调用Zebra模块向网络打印机打印PRN文件遇问题求助

问题排查与修复

核心问题

你的代码和Zebra官网示例的关键差异,是导致打印失败的主要原因:

  • 发送的是字符串而非字节串:网络打印机要求接收字节流,官网代码用b""显式声明字节数据,而你的代码直接发送格式化后的字符串。
  • 存在语法错误:函数定义def print_label(printer_name)缺少冒号,import socket放在函数内部会导致重复导入或执行异常。
  • 错误处理过于笼统:无法定位具体异常(如IP错误、连接超时、模板格式化失败)。
  • 未验证打印机IP:未确认printers[printer_name]返回的IP是否正确、可访问。

修复后的代码

import socket

# 定义打印机IP字典(根据实际情况修改)
printers = {
    "office_printer": "10.80.209.106",
    # 添加其他打印机配置
}

def print_label(printer_name):
    # 先验证打印机名称是否存在
    host = printers.get(printer_name)
    if not host:
        print(f"错误:无效的打印机名称 {printer_name}")
        return
    
    port = 9100
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    try:
        sock.connect((host, port))
        # 将ZPL模板转为字节串(编码用utf-8或打印机支持的编码)
        zpl_content = ZEBRA_TEMPLATE_VAR.format(var1, var2, var3, var4).encode('utf-8')
        sock.sendall(zpl_content)  # 用sendall确保数据全部发送
        sock.shutdown(socket.SHUT_WR)  # 告知打印机数据发送完毕
        
        # 可选:接收打印机响应,排查打印状态
        resp = sock.recv(1024)
        if resp:
            print(f"打印机反馈:{resp.decode('utf-8')}")
    except socket.gaierror:
        print(f"错误:无法解析打印机IP {host}")
    except socket.timeout:
        print(f"错误:连接打印机 {host} 超时")
    except ConnectionRefusedError:
        print(f"错误:打印机 {host} 拒绝连接,请检查端口/打印机状态")
    except Exception as e:
        print(f"未知错误:{str(e)}")
    finally:
        sock.close()

其他问题的解决建议

  • zebra模块提示打印机名称无效:网络打印机无需本地打印机名称,直接用IP+端口连接即可。若坚持用zebra模块,需确保配置的是打印机的网络标识(如共享名或IP),而非本地设备名。
  • simple_zpl2模块无数据发送:检查模块生成的ZPL代码是否合法,调用发送方法时需将ZPL内容转为字节串,同时用telnet {打印机IP} 9100测试端口是否连通。

内容的提问来源于stack exchange,提问作者Fernando Beckworth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:25:32