Python win32print打印机状态混乱

时间:2012-08-20 16:41:30

标签: python windows winapi printing wmi

我一直在使用Python的win32print模块来尝试获取有关打印机组的各种信息,例如驱动程序名称,作业数,正在使用的端口,状态等等。它已经大部分成功了,但是我在使用win32print从API返回的状态代码时遇到了很多麻烦。

我一直在使用win32print.GetPrinter方法,该方法返回一个PRINTER_INFO_字典,其中一个映射为Status。但是,没有记录哪些状态代码对应于什么打印机状态。似乎0是空闲的,1是暂停的,但除此之外我不确定它意味着什么。

当我查找windows 32bit API的常量值时,我找到了this page,但我找不到的状态代码似乎与之匹配。很多时候,我得到一个状态代码,如1052800(从Epson打印机那里获得),这个代码不在win32api常量的列表中。

我也尝试使用WMI模块来做到这一点,但效果更差。

我想获取打印机的打印机状态代码缺纸,打印机门打开,碳粉不足,卡纸等。有没有人知道在哪里可以找到这些状态代码的含义,甚至是更好的解决方案完全找到打印机状态?

谢谢!

2 个答案:

答案 0 :(得分:1)

返回的状态是位掩码,例如here描述。多个值可以一起进行OR运算,因此您的值1052800(十六进制0x101080)表示打印机具有(所有)状态;

  • PRINTER_STATUS_USER_INTERVENTION
  • PRINTER_STATUS_NOT_AVAILABLE
  • PRINTER_STATUS_OFFLINE

答案 1 :(得分:0)

我想分享我在 Windows 10 中检查打印机是否脱机的经验。 PRINTER_INFO_2win32print.GetPrinter 中的状态标志对我不起作用,因为对于所有已安装的打印机,它始终为 0。 感谢 this stackoverflow discussion for C++,我发现打印机属性中的 PRINTER_ATTRIBUTE_WORK_OFFLINE 标志可以表示打印机是否处于离线状态。

handle = win32print.OpenPrinter(printer_name)   
attributes = win32print.GetPrinter(handle)[13]
print(f'{printer_name} is offline? :{(attributes & 0x00000400) >> 10}')

[13] 是返回元组中的属性位置。 microsoft doc
0x00000400 是 PRINTER_ATTRIBUTE_WORK_OFFLINE 的十六进制代码。 microsoft doc