我可以将打印作业直接从 python 程序发送到 CUPS 打印服务器的 IP 地址吗?
Can I send print jobs directly from a python program to the IP address of a CUPS print server?
我有两台 linux 台固定 IP 地址的计算机:
- 一个打印服务器,通过CUPS共享连接的打印机。
(服务器的 IP 地址为“192.168.1.2”,打印机名为 "test_printer"。)
- 一台计算机,其上有 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模块pkipplib / pyipptool
不幸的是,2018 年似乎没有实现 Internet Printing Protocol (IPP) 的有效 python3 库。
我用的是python3.6.7.
打印服务器使用 CUPS 2.2.1。
不是 Python 程序员,我无法提供任何示例代码。
但我可以给你一些其他的提示:
您的假设 "in theory, [....] just send correctly formatted data to the IP address + port" 是错误的。
如果你发送东西,你必须"talk IPP"到CUPS服务器(是的,通过IP地址+端口631)。但是仅仅发送一个文件比谈论 IPP 要少得多。
否则,您可以使用 'netcat IPaddress port-no < filename'
打印到任何 CUPS 队列(这将是一个巨大的安全问题)。
因此,如果您想将程序与 IPP/CUPS
集成,则必须使用一些支持 IPP 的库
一种替代方法是让您的程序通过能够执行此操作的 CLI 工具执行 "IPP talk to CUPS"。
查看设计 IPP 的打印机工作组 (PWG) 的 ippsample
code。那还在 "beta" 中,但已经完全可用。它的所有二进制文件都是命令行 (CLI) 实用程序:
提供ippfind
辅助工具。如果您 运行 它没有任何参数,它将通过打印其各自的 IPP URI 来打印可用 IPP 服务(打印服务器 and/or 打印机设备)的列表。
它提供了一个ippserver
命令行,它可以启动一个成熟的,你猜对了,IPP服务器暴露你想要的任何功能。
然后 ipptool
作为 IPP 客户端包含在内。您可以 运行 'ipptool -f myprintfile -t -v ipp://cupsserver/printers/test_printer print-job.test'
将 "myprintfile" 发送到队列 "test_printer" on "cupsserver"(给出示例 IPP URI ipp://cupsserver/printers/test_printer)并观看它会在这样做时将 IPP 与 CUPS 通信。
另请参阅我的 ASCIIcast“[TUTORIAL] IPP 示例软件(使用 AppImage 制作)”here。
{https://asciinema.org/a/155588 }。 提示:如果播放速度太快无法及时跟上和理解屏幕,请使用'pause'按钮,以您自己的速度阅读,然后继续播放。
我有两台 linux 台固定 IP 地址的计算机:
- 一个打印服务器,通过CUPS共享连接的打印机。
(服务器的 IP 地址为“192.168.1.2”,打印机名为 "test_printer"。) - 一台计算机,其上有 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模块pkipplib / pyipptool
不幸的是,2018 年似乎没有实现 Internet Printing Protocol (IPP) 的有效 python3 库。
我用的是python3.6.7.
打印服务器使用 CUPS 2.2.1。
不是 Python 程序员,我无法提供任何示例代码。
但我可以给你一些其他的提示:
您的假设 "in theory, [....] just send correctly formatted data to the IP address + port" 是错误的。
如果你发送东西,你必须"talk IPP"到CUPS服务器(是的,通过IP地址+端口631)。但是仅仅发送一个文件比谈论 IPP 要少得多。
否则,您可以使用
'netcat IPaddress port-no < filename'
打印到任何 CUPS 队列(这将是一个巨大的安全问题)。因此,如果您想将程序与 IPP/CUPS
集成,则必须使用一些支持 IPP 的库
一种替代方法是让您的程序通过能够执行此操作的 CLI 工具执行 "IPP talk to CUPS"。
查看设计 IPP 的打印机工作组 (PWG) 的
ippsample
code。那还在 "beta" 中,但已经完全可用。它的所有二进制文件都是命令行 (CLI) 实用程序:提供
ippfind
辅助工具。如果您 运行 它没有任何参数,它将通过打印其各自的 IPP URI 来打印可用 IPP 服务(打印服务器 and/or 打印机设备)的列表。它提供了一个
ippserver
命令行,它可以启动一个成熟的,你猜对了,IPP服务器暴露你想要的任何功能。然后
ipptool
作为 IPP 客户端包含在内。您可以 运行'ipptool -f myprintfile -t -v ipp://cupsserver/printers/test_printer print-job.test'
将 "myprintfile" 发送到队列 "test_printer" on "cupsserver"(给出示例 IPP URI ipp://cupsserver/printers/test_printer)并观看它会在这样做时将 IPP 与 CUPS 通信。
另请参阅我的 ASCIIcast“[TUTORIAL] IPP 示例软件(使用 AppImage 制作)”here。 {https://asciinema.org/a/155588 }。 提示:如果播放速度太快无法及时跟上和理解屏幕,请使用'pause'按钮,以您自己的速度阅读,然后继续播放。