Могу ли я отправлять задания на печать непосредственно из программы на Python на IP-адрес сервера печати CUPS?
У меня есть два компьютера 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 / https://pypi.org/project/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
К сожалению, похоже, что нет работающей библиотеки python3, которая реализует протокол печати через Интернет (IPP) в 2018 году.
Я использую Python 3.6.7.
Сервер печати использует CUPS 2.2.1.
1 ответ
Не будучи программистом Python, я не могу предоставить пример кода.
Но я могу дать вам несколько других советов:
Ваше предположение, что "теоретически [....] просто отправляет правильно отформатированные данные на IP-адрес + порт" неверно.
Если вы что-то отправляете, вы должны "поговорить по IPP" с сервером CUPS (да, через IP-адрес + порт 631). Но просто отправить файл намного меньше, чем говорить IPP.
Иначе вы могли бы использовать
'netcat IPaddress port-no < filename'
печатать в любую очередь CUPS (что было бы огромной проблемой безопасности).Таким образом, вы должны использовать библиотеку с поддержкой IPP, если хотите интегрировать свою программу с IPP/CUPS
Одной из альтернатив может быть то, что вы позволите своей программе выполнить "IPP talk to CUPS" с помощью инструмента CLI, который способен это сделать.
Посмотрите на
ippsample
код Рабочей группы по принтерам (PWG), которая разработала IPP. То есть в "бета" все еще, но уже полностью пригодный для использования. Все его двоичные файлы являются утилитами командной строки (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" на "cupsserver" (приведенном в примере с URI IPP ipp: // cupsserver / printers / test_printer) и посмотреть, как он передает IPP на CUPS, пока это происходит.
Смотрите также мой ASCIIcast "[Учебник] Пример программного обеспечения IPP (сделанный с AppImage)" здесь. { /questions/218367/kak-ya-mogu-uznat-kogdanet-systemdiagnosticsprocess-uspeshno-zapuschen-ili-ne-rabotaet/218382#218382 }. Подсказка: если он воспроизводится слишком быстро, чтобы следить за экранами и понимать их вовремя, используйте кнопку "пауза", читайте со своей скоростью, затем возобновите воспроизведение.