python - 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 界面中显示为暂停。
也许我这样做完全错误。我希望有人可以帮助我解决这个问题。谢谢。
解决方案
我认为不可能像这样使用 pycups API。发送 IPP 请求的正确方法是通过cupsDoRequest
API 调用,但目前 pycups 并未直接公开该部分 API。
该writeIO
方法在低得多的级别上工作,通常由 CUPS 代码在内部用于实际序列化请求。它期望的回调应该将序列化数据写入 HTTP 连接,因此您的ipp_hold_new_jobs_request_handler
函数需要这样做,但它不能,因为它无权访问底层 HTTP 连接。
调用时发生的最接近cupsDoRequest
实际可以在此函数中完成的事情是调用对象的writeRequestData
方法Connection
,但这也不起作用,因为在调用之前writeRequestData
,必须发送适当的 HTTP 标头(这是已完成的一部分) by cupsDoRequest
) 并且 pycups 不会公开执行此操作所需的 API。
总之,pycups 目前不允许发送任意 IPP 请求。只有类提供的方法Connection
可以用来发送请求。
推荐阅读
- sql-server - 阶乘函数错误 - 超出最大存储过程、函数、触发器或视图嵌套级别
- c# - 如何使用 fileupload 将图像存储到项目外部的另一个文件夹?
- r - 使用 [r] 通过 POST 请求从 Internet 获取数据的问题
- php - 在 php OOP 中使用 $this 可以访问不定义公共属性
- citrus-framework - Citrusframework - 包括标准的 TestNG 测试类
- python - Python - 以结构化方式向类动态添加新函数
- java - Android kotlin / JAVA - jloop AsyncHttpClient 检查外部文件是否存在
- c# - 允许 Windows 服务帐户与桌面交互
- flutter - Flutter Hero 动画不使用主题色?
- r - 低等级预测