Pycups使用IPP属性和解析响应创建并发送IPP请求(启用IPP:HoldNewJobs)

2024-05-13 02:45:02 发布

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

在CUPS中,我希望保留所有新打印机作业,检查打印机的墨盒级别,并逐个释放打印作业。(我的打印机在低于一定百分比时会杀死盒带芯片,以防止重新填充。)

我有CUPS通知(RSS),可以获取我的盒带级别。现在,我想在CUPS(…/printers/myPrinter)中的特定打印机上启用“保留新作业”属性。在此之后,我必须了解如何获取所有处于保留状态的作业并释放一个(通过作业ID或其他方式)(最好是FIFO(FHFR)),以确保完整性:如果盒带低于阈值,则作业将被保留,直到盒带重置(手动)并按下Home Assistant中的按钮

Pycups(libcups-Python绑定)似乎没有文档记录,与libcups本身的差异足以让人迷失方向。似乎没有IPP请求Pycup的例子。这是我的一张照片(以testprinter的形式发送到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界面中显示为保留

也许我这样做完全是错误的。我希望有人能帮我解决这个问题。谢谢


Tags: pdfresponserequest作业jobs打印机级别handler
1条回答
网友
1楼 · 发布于 2024-05-13 02:45:02

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

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

调用cupsDoRequest时最接近实际可以在这个函数中完成的事情是调用Connection对象的writeRequestData方法,但这也不起作用,因为在调用writeRequestData之前,必须发送适当的HTTP头(这是cupsDoRequest所做的工作的一部分)pycups不公开实现这一点所需的api

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

相关问题 更多 >