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

问题描述 投票:3回答:1

我有两台具有固定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 import cups with open("/home/user/Documents/some.txt", "w") as f: f.write("hello world\n") conn = cups.Connection() conn.printFile("test_printer", "/home/user/Documents/some.txt", "some_title", {}) 在我可以使用打印机之前,我必须先添加它,然后依赖于通过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


我使用python 3.6.7。 打印服务器使用CUPS 2.2.1。

python python-3.x printing cups network-printers
1个回答
2
投票

不是Python程序员,我不能提供任何示例代码。

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

  1. 你的假设,“理论上,[....]只是将格式正确的数据发送到IP地址+端口”是错误的。 如果你发送了什么,你必须“联系IPP”到CUPS服务器(是的,通过IP地址+端口631)。但只是发送文件比谈论IPP要少得多。 否则,您可以使用'netcat IPaddress port-no < filename'打印到任何CUPS队列(这将是一个巨大的安全问题)。 因此,如果要将程序与IPP / CUPS集成,则必须使用一些支持IPP的库
  2. 一种替代方案可能是让您的程序通过能够执行此操作的CLI工具执行“与CUPS进行IPP通话”。 看看设计IPP的打印机工作组(PWG)的ippsample code。那仍处于“测试阶段”,但已经完全可用。它的所有二进制文件都是命令行(CLI)实用程序: 它提供了ippfind帮助工具。如果在没有任何参数的情况下运行它,它将通过打印各自的IPP URI来打印可用IPP服务(打印服务器和/或打印机设备)的列表。 它提供了一个ippserver命令行,它可以启动一个完全成熟的,你猜对了,IPP服务器暴露你想要的任何功能。 然后有ipptool作为IPP客户端。您可以运行'ipptool -f myprintfile -t -v ipp://cupsserver/printers/test_printer print-job.test'将“myprintfile”发送到“杯子服务器”上的队列“test_printer”(以示例IPP URI ipp:// cupsserver / printers / test_printer给出)并观察它与CUPS进行通话,同时执行此操作。

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

© www.soinside.com 2019 - 2024. All rights reserved.