Python未在Windows 10下的中文热敏打印机58mm上的Python escpos pyusb、libusb中实现异常

2024-05-23 18:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,这不仅仅是一个问题,也是一个答案。我有一台58毫米的收据打印机,我正在尝试使用escpos sdk进行设置,到目前为止,我花了一整天的时间来处理冗余错误,比如“未实现”的raise错误,并且没有太多关于它的信息。因此,我将发布我所做的,以使其发挥作用

首先,阅读this guide的第一步,并从依赖项步骤安装所有库(我使用anaconda来管理我的虚拟环境,所以我通过anaconda提示符安装)

然后,从最新的windows二进制文件here下载libusb,解压并根据您的操作系统搜索32位或64位dll(显然这对于工作很重要),对于64位选择MS64/dll文件,并将其复制到windows/system32中,对于32位MS32/dll文件,在windows/SYSWOW64中,文件夹路径应位于windows配置中的%path%变量中。如果您正在使用anaconda并激活虚拟环境,请将其复制到“X:\USERS\USER\Anaconda3\env\DLLs”和“X:\USERS\USER\Anaconda3\envs\env\Library\bin”中,其中X、USER和env应与您的虚拟环境路径文件夹相匹配(如果您为所有用户安装了anaconda,则用户应位于“all USERS”文件夹中,并且默认情况下它是隐藏的)

在python中运行此代码,将提示所有设备的vid's和pid's列表,如果需要搜索pid's和vid's(后面只有4位数字),则需要选择打印机vid和pid,然后搜索每个设备以找到打印机id,并在获得这些信息后将其存储到某个位置。注意,如果在安装驱动程序后执行此操作,则可能看不到此处列出的打印机。在我的案例中,是VID_0483&;PID_070B

import win32com.client

wmi = win32com.client.GetObject ("winmgmts:")
for usb in wmi.InstancesOf ("Win32_USBHub"):
print(usb.DeviceID)

获取Zadig并安装它,安装后打开它和clic选项菜单,然后列出所有设备,(如果不这样做,您将看不到任何设备),然后搜索您的设备,我的设备列在“Usb打印支持”下选择它,验证pid和vid供应商与您的匹配,然后选择WinUsb驱动程序,然后按安装/重新安装按钮,做这件事需要一段时间(要有耐心)

此时,您应该完成库和驱动程序的安装,并且应该毫无问题地运行此代码,并获得如下内容<;libusb1.\u LibUSB对象位于0x000001F74D7BD688>

import usb.core
import usb.util
import usb.backend.libusb1
backend = usb.backend.libusb1.get_backend()
print(backend)

这是棘手的部分。如果运行此代码:

from escpos.printer import Usb
import usb.core
import usb.util
import usb.backend.libusb1

p = Usb(0x0483, 0x070B, 0, 0x81, 0x02)
p.text("Hello World            Hola   1\n")

通常会出现“未实现”raise错误,因为escpos库不是为windows编写的!:/。因此,回到env文件夹或python安装文件夹,转到env/lib/site packages/escpos/并打开printer.py文件。从第61行到第71行进行评论或删除,但如果你是像我一样的新手,只需在每行中键入a。应在同一列中,以避免识别错误。在“check_driver=None”行下方和第73行上方执行,如下所示:

        check_driver = None

    #try:
    #    check_driver = self.device.is_kernel_driver_active(0)
    #except NotImplementedError:
    #    pass

    #if check_driver is None or check_driver:
    #    try:
    #        self.device.detach_kernel_driver(0)
    #    except usb.core.USBError as e:
    #        if check_driver is not None:
    #            print("Could not detatch kernel driver: {0}".format(str(e)))

    try:
        self.device.set_configuration()
        self.device.reset()
    except usb.core.USBError as e:
        print("Could not set configuration: {0}".format(str(e)))

def _raw(self, msg):

然后你就可以和你的打印机通信了。再次运行:

from escpos.printer import Usb
import usb.core
import usb.util
import usb.backend.libusb1

#remember to change pid and vid with your own values!
p = Usb(0x0483, 0x070B, 0, 0x81, 0x02)
p.text("Hello World            Hola   1\n")

你应该在打印机中看到一行打印机!,您可能需要按进纸按钮才能看到它。如果得到的端点无效,则需要在vid和pid(0x81,0x02)旁边的Usb()arguments函数中设置自己的端点,并替换它们。通常为0x81和0x82,但可能有所不同

我希望你能找到有用的信息,干杯


Tags: coreimportenv文件夹backendwindowscheckdriver