我可以将打印作业直接从python程序发送到CUPS打印服务器的IP地址吗?

2024-06-06 21:37:22 发布

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

我有两台具有固定IP地址的linux计算机:

  1. 一种打印服务器,通过CUPS共享连接的打印机。
    (服务器的IP地址为“192.168.1.2”,打印机名为“test_printer”。)
  2. 运行python应用程序的计算机,应该能够使用这个打印服务器。在

不幸的是,通过CUPS的打印机传播似乎不能可靠地工作(可能是由于网络的结构)。在

我可以将打印作业直接从python程序发送到CUPS打印服务器吗?
如果是的话,你能举个小例子吗?

理论上,我只需要将正确格式的数据发送到IP地址+端口,但我没有让它工作。。。在


以下是迄今为止我发现的方法以及我在这些方法中存在的问题:

  • 命令“lpr”

    import subprocess
    
    lpr = subprocess.Popen("usr/bin/lpr", stdin=subprocess.PIPE)        # on some distros the command is 'lp'
    lpr.stdin.write("hello world\n")
    lpr.stdin.close()
    

    依赖于通过CUPS的打印机传播。


  • python模块pycups

    ^{pr2}$

    在我可以使用打印机之前,我必须先添加它,而这又依赖于通过CUPS的传播。
    我也没能让conn.addPrinter()工作。


  • python模块python-escpos/python-printer-escpos

    import escpos.printer
    
    p = escpos.printer.Network("192.168.1.2", port=631)        # port 9100 seems not to work.
    p.text("hello world\n")
    p.close()
    

    可能是最有希望的方法。。。不幸的是,它不打印任何内容,并在关闭时引发异常。在

    # The traceback was produced in the interactive shell.
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
        File "/home/user/.local/lib/python3.6/site-package/escpos/printer.py", line 214, in close
            self.device.shutdown(socket.SHUT_RDWR)
    OSError: [Errno 107] Transport endpoint is not connected
    



我使用python3.6.7。
打印服务器使用CUPS 2.2.1。


Tags: 模块the方法inimportcloseis计算机
1条回答
网友
1楼 · 发布于 2024-06-06 21:37:22

作为一个Python程序员,我不能提供任何示例代码。在

但我可以给你一些其他的提示:

  1. 你认为“理论上,[…..]只将正确格式的数据发送到IP地址+端口”是错误的。在

    如果您发送了什么,您必须“talk IPP”到CUPS服务器(是的,通过IP地址+端口631)。但是,仅仅发送一个文件远不如说IPP。在

    否则,您可以使用'netcat IPaddress port-no < filename'打印到任何CUPS队列(这将是一个巨大的安全问题)。在

    因此,如果要将程序与IPP/CUPS集成,则必须使用一些支持IPP的库

  2. 另一种方法是让程序通过一个CLI工具执行“IPP与CUPS的对话”。在

    看看设计IPP的打印机工作组(PWG)的^{} code。这是“测试版”仍然,但已经完全可用。它的所有二进制文件都是命令行(CLI)实用程序:

    • 它提供ippfind助手工具。如果不带任何参数运行它,它将通过打印各自的IPP uri来打印可用IPP服务(打印服务器和/或打印机设备)的列表。

    • 它提供了一个ippserver命令行,可以启动一个完全成熟的IPP服务器,可以公开您想要的任何特性。

    • 然后,ipptool作为IPP客户机包含。您可以运行'ipptool -f myprintfile -t -v ipp://cupsserver/printers/test_printer print-job.test'“myprintfile”发送到队列“cupsserver”上的“测试打印机”(以IPP URI为例)ipp://cupsserver/printers/test_打印机当它这样做的时候,看着它和杯子说话。

在 另请参阅我的ascicast“[TUTORIAL]IPP Sample Software(made with an AppImage)”here。 {https://asciinema.org/a/155588}。提示:如果播放速度太快,无法及时跟踪和理解屏幕,请使用“暂停”按钮,以自己的速度阅读,然后继续播放。

相关问题 更多 >