Phython3 QT4, import cups -> Wie kann ich "Papier leer" abfragen und ausgeben?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
medix
User
Beiträge: 7
Registriert: Dienstag 13. November 2018, 20:57

Hallo Gemeinde,

habt Dank für die Aufnahme hier im Forum.
Meine bisherigen Programmiererfahrungen basieren vor allem auf php, derzeit setze ich mein erstes Python - Projekt um.
Ich nutze kein Framework (derzeit), tippe meinen Code in Geany unter Linux.

Mein Problem, mit welchem ich nicht zufriedenstellend weiter komme:

Code: Alles auswählen

...
import sys
import os
import subprocess
import time
import cups
(FROM ....... PyQt5, -> QtCore, QtGui, QtWidgets... und paar andere Sachen)
...
PRINTER = 'meinDrucker'
FILE = 'meineDatei'
...
##### Hier starte ich den Drucker neu, da das Teil nach Papierwechsel nicht automatisch wieder "aufwacht"###
##### Diese Zeile würde ich gern nur dann ausführen, wenn cups den Fehler "Papier alle" oder "Patrone alle" brachte
os.system('/usr/sbin/cupsenable meinDrucker')


conn = cups.Connection()
conn.printFile(PRINTER, FILE, title='Ausdruck', option={})


in /val/log/cups/error.log finde ich
E [......] [Job xxx] No paper try loaded, aborting

Ich möchte erreichen, dass, sofern der Druck wegen zB fehlendem Papier nicht ausgeführt werden kann, eine Meldung in Form eines Bildes ausgegeben wird.
Das mache ich bereits beim Start des Drucks mit

Code: Alles auswählen

pixmap = QPixmap('/home/pi/meineMeldung.jpg')
picScaled = pixmap.scaledToWidth(200)
self.image.setPixmap(picScaled)
Nur wie "weiß" das Script, dass kein Papier da ist? Bzw. das eben ein Fehler beim Drucker vorliegt? Muss dazu die error.log gelesen und ausgewertet werden? Oder gibts eine andere - bessere - Möglichkeit?

Vielen Dank!
medix aka Andy
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ja alles unterirdisch dokumentiert in pycups. Aber es gibt wohl Event notifications, und da sollte sowas ja kommen.
medix
User
Beiträge: 7
Registriert: Dienstag 13. November 2018, 20:57

Also ich kann schon mal die Events "abonnieren". Aber nur, wenn ich cups mit cups-http-notifier die Events auf zB 9911 ausgeben lasse. Dann müsste ich auch noch einen Webserver laufen haben. Das ist ... NÖ!

Code: Alles auswählen

connection = cups.Connection()
connection.createSubscription(
    uri="http://localhost:631/printers/meinDrucker",
    recipient_uri="http://localhost:9911",
    events=['all'],
    lease_duration=0
)

...

connection = cups.Connection()
connection.printFile(PRINTER, meineDatei....)

...

Ich komme mit dem "Event notifications" noch nicht weiter. Google spuckt viel aus aber zu selektieren, was für meine Frage relevant ist, fällt mir sehr schwer.

Kann mir hierzu jemand Hilfestellung geben? Relevante Links wären sehr willkommen. Danke!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wieso "NÖ"? Das ist mit Bordmitteln von Python alles machbar, und wenn das die Art ist, wie cups das macht, dann ist das halt "LEIDER DOCH". Das ist am Ende nur ein Socket, der auf irgendeinem frei gewaehlten Port lauscht. So what... auch nicht schlimmer oder besser als jede geoeffnete Datei.

Ich habe auch nur ein bisschen gegoogelt. Wirklich gute Doku findet man nicht, und darum kann man auch nicht beurteilen, was von dem Kram da nun richtig ist und was nicht. Vielleicht findest du andere Projekte, die pycups benutzen - scheint insgesamt eher ein mittelgeiles Paket, das schon lange nicht mehr richtig entwickelt wird.
medix
User
Beiträge: 7
Registriert: Dienstag 13. November 2018, 20:57

Also danke soweit. Ich habe bis eben auch viel gelesen. Es wird tatsächlich auf

Code: Alles auswählen

connection = cups.Connection()
connection.createSubscription(
    uri="http://localhost:631/printers/meinDrucker",
    recipient_uri="http://localhost:9988",
    events=['all'],
    lease_duration=0
)
hinaus laufen. ich hab vorher über subprocess('lp'...) gedruckt. Ging auch aber auch da komme ich nicht an "Papier alle" ran.

Lesen bildet. Danke für Deine Geduld
Antworten