Могу ли я отправлять задания на печать непосредственно из программы на Python на IP-адрес сервера печати CUPS?

У меня есть два компьютера Linux с фиксированными IP-адресами:

  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 / 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 3.6.7.
Сервер печати использует CUPS 2.2.1.

1 ответ

Решение

Не будучи программистом Python, я не могу предоставить пример кода.

Но я могу дать вам несколько других советов:

  1. Ваше предположение, что "теоретически [....] просто отправляет правильно отформатированные данные на IP-адрес + порт" неверно.

    Если вы что-то отправляете, вы должны "поговорить по IPP" с сервером CUPS (да, через IP-адрес + порт 631). Но просто отправить файл намного меньше, чем говорить IPP.

    Иначе вы могли бы использовать 'netcat IPaddress port-no < filename' печатать в любую очередь CUPS (что было бы огромной проблемой безопасности).

    Таким образом, вы должны использовать библиотеку с поддержкой IPP, если хотите интегрировать свою программу с IPP/CUPS

  2. Одной из альтернатив может быть то, что вы позволите своей программе выполнить "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 }. Подсказка: если он воспроизводится слишком быстро, чтобы следить за экранами и понимать их вовремя, используйте кнопку "пауза", читайте со своей скоростью, затем возобновите воспроизведение.

Другие вопросы по тегам