首页 > 解决方案 > Pycups - 使用 IPPAttribute 创建和发送 IPPRequest 并解析响应(启用 IPP:Hold-New-Jobs)

问题描述

在 CUPS 中,我想保留所有新的打印机作业,检查我的打印机的墨盒水平,并一一发布打印作业。(我的打印机在低于一定百分比时会杀死墨盒芯片以防止重新填充。)

我有 CUPS 通知 (RSS) 并且可以获取我的墨盒水平。现在,我想在 CUPS (.../printers/myPrinter) 中的特定打印机上启用“hold-new-jobs”属性。在此之后,我必须找出如何获取所有暂停的作业并释放一个(通过作业 ID 等)(最好是 FIFO(FHFR))为了完整性:如果磁带低于阈值,则作业被暂停直到墨盒被重置(手动)并按下 Home Assistant 中的按钮。

Pycups(libcups Python 绑定)似乎没有文档记录,并且与 libcups 本身的差异足以迷失方向。pycups 似乎没有 IPPRequests 的例子。这是我的镜头(to_pdf 作为测试打印机):

import cups

# Response is a set of bytes. Not clear (to me) what it means and if its parsed or can be parsed somewhere.
def ipp_hold_new_jobs_request_handler(response):
    print("Hold_all_jobs handler called. Response: {}".format(response))


ipp_request = cups.IPPRequest(cups.IPP_OP_HOLD_NEW_JOBS)
ipp_attribute = cups.IPPAttribute(cups.IPP_TAG_OPERATION, cups.IPP_TAG_URI, "printer-uri",
                                  "http://cups.mydomain.ext:631/printers/to_pdf")
ipp_request.add(ipp_attribute)
response = ipp_request.writeIO(ipp_hold_new_jobs_request_handler)
print('repsonse: {}'.format(response)) # Returns -1

while True:
    pass

如果此请求成功,我希望新作业在 CUPS Web 界面中显示为暂停。

也许我这样做完全错误。我希望有人可以帮助我解决这个问题。谢谢。

标签: pythonmacosprintingcupspycups

解决方案


我认为不可能像这样使用 pycups API。发送 IPP 请求的正确方法是通过cupsDoRequestAPI 调用,但目前 pycups 并未直接公开该部分 API。

writeIO方法在低得多的级别上工作,通常由 CUPS 代码在内部用于实际序列化请求。它期望的回调应该将序列化数据写入 HTTP 连接,因此您的ipp_hold_new_jobs_request_handler函数需要这样做,但它不能,因为它无权访问底层 HTTP 连接。

调用时发生的最接近cupsDoRequest实际可以在此函数中完成的事情是调用对象的writeRequestData方法Connection,但这也不起作用,因为在调用之前writeRequestData,必须发送适当的 HTTP 标头(这是已完成的一部分) by cupsDoRequest) 并且 pycups 不会公开执行此操作所需的 API。

总之,pycups 目前不允许发送任意 IPP 请求。只有类提供的方法Connection可以用来发送请求。


推荐阅读