I adapted some code from David Boddie into a Python class to write
directly to Linux print queues. I have used it in one project and
it worked just fine. I've attached a copy for your use. You are
free to use it as you wish, with no guarantees or warranties.
Hope it helps.
Larry Bates
Steve M wrote:
Hello,
I'm having problems sending information from a python
script to a printer. I was wondering if someone might send me
in the right direction. I wasn't able to find much by Google
TIA
Steve
#! /usr/bin/python
"""
Name : lpr.py
Author : adapted from code by David Boddie
Created : Tue 08th August 2000
Last modified : Thu 06th September 2001
Purpose : Send a file to a printer queue.
"""
import os, socket, string, sys
class lprClass:
_debug=0
_trace=0
def __init__(self, host, user, server, printer):
#
# Handle empty arguments by assiging default values
#
if host: self.host=host
else: self.host=socke t.gethostname()
if user: self.user=user
else:
try:
self.user=os.en viron['USER']
except KeyError:
print "lprClass***Err or no user passed to class and no USER env variable found"
sys.exit(2)
if server: self.server=ser ver
else: self.server=soc ket.gethostbyad dr(self.host)[2][0]
if printer: self.printer=pr inter
else:
try:
self.printer=os .environ['PRINTER']
except KeyError:
print "lprClass***Err or no printer passed to class and no PRINTER env variable found"
sys.exit(2)
if self._debug:
print "lprClass** * host=",self.hos t
print "lprClass** * user=",self.use r
print "lprClass** * server=",self.s erver
print "lprClass** * printer=",self. printer
#
# Create a socket object to communcate with the LPR daemon
#
if self._trace: print "lprClass***Cre ating a socketobj instance"
self.socketobj= socket.socket(s ocket.AF_INET, socket.SOCK_STR EAM)
if self._trace: print "lprClass***Con ecting to port 515 on server"
self.socketobj. connect((self.s erver, 515))
if self._trace: print "lprClass***Ini tializing LPR daemon for job to printer=", self.printer
self.socketobj. send("\002"+sel f.printer+"\012 ")
d=self.socketob j.recv(1024)
#
# Wait for reply and check response string
#
errormsg="lprCl ass***Error initializing communications with LPR daemon"
if d != "\000": self._abort(d, errormsg)
return
def _initcontrol(se lf, filename):
#
# Build a control string
#
control='H'+sel f.host[:31]+"\012"+'N'+fil ename[:131]+"\012"+ \
'P'+self.user[:31]+"\012"+'o'+fil ename[:131]+"\012"
#------------------------------------------------------------------------------------
# Send the receive control file subcommand
#
if self._trace: print "lprClass***Sen ding the receive control file subcommand"
self.socketobj. send("\002"+str (len(control))+ " cfA000"+self.ho st+"\012")
#
# Wait for reply and check response string
#
if self._trace: print "lprClass***Wai ting for reply"
d=self.socketob j.recv(1024)
errormsg="lprCl ass***Error in control string initialization for LPR daemon"
if d != "\000": self._abort(d, errormsg)
#------------------------------------------------------------------------------------
# Send the control file
#
if self._trace: print "lprClass***Sen ding the control file command"
self.socketobj. send(control)
self.socketobj. send("\000")
#
# Wait for reply and check response string
#
if self._trace: print "lprClass***Wai ting for reply"
d=self.socketob j.recv(1024)
errormsg="lprCl ass***Error in control string for LPR daemon"
if d != "\000": self._abort(d, errormsg)
return
def _abort(self, data, errormsg):
print errormsg
print data.strip()
self.socketobj. send("\001\012" )
self.socketobj. close()
sys.exit(0)
def _closelpr(self) :
self.socketobj. send("\000")
#
# Wait for reply
# print "Wait for reply"
d=self.socketob j.recv(1024)
errormsg="lprCl ass***Error in _closelpr"
if d != "\000": self._abort(d, errormsg)
#
# Close the socket connection
#
self.socketobj. close()
return
def _sendheader(sel f, length):
#------------------------------------------------------------------------------------
# Send the receive data file subcommand
#
if self._trace: print "lprClass***Sen ding the receive data file subcommand"
self.socketobj. send("\003"+str (length)+" dfA000"+self.ho st+"\012")
#
# Wait for reply and check response string
#
if self._trace: print "lprClass***Wai ting for reply"
d=self.socketob j.recv(1024)
errormsg="lprCl ass***Error in receive data file subcommand for LPR daemon"
if d != "\000": self._abort(d, errormsg)
return
def queuefile(self, filename):
try:
ifile=open(file name,'r')
except:
print "lprClass***Una ble to find filename=%s to print" % filename
return
#
# Call routine to initialize LPR daemon with control information
#
self._initcontr ol(filename)
#
# Must determine the length of the file by seeking to the
# end, save for later
#
ifile.seek(0, 2)
length = ifile.tell()
if self._debug: print "lprClass***que uefile-length=",length
#
# Send file header to LPR
#
self._sendheade r(length)
#
# Return to the beginning of the file
#
ifile.seek(0, 0)
#
# Send the data file
if self._debug: print "Sending the data file"
while 1:
contents = ifile.readline( )
if not contents: break
self.socketobj. send(contents)
ifile.close()
self._closelpr( )
return
def queuestring(sel f, string):
#
# Call routine to initialize LPR daemon with control information
#
self._initcontr ol('')
self._sendheade r(len(string))
self.socketobj. send(string)
self._closelpr( )
return
if __name__=="__ma in__":
import time
LPR=lprClass('' ,'','','alarm')
LPR.queuestring ('22222222222')
time.sleep(3.0)
LPR=lprClass('' ,'','','alarm')
LPR.queuestring ('00000000000')
LPR=lprClass('' ,'','','alarm')
LPR.queuefile(' testalarm.py')
time.sleep(3.0)
LPR=lprClass('' ,'','','alarm')
LPR.queuestring ('00000000000')