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=socket.gethostname() if user: self.user=user else: try: self.user=os.environ['USER'] except KeyError: print "lprClass***Error no user passed to class and no USER env variable found" sys.exit(2) if server: self.server=server else: self.server=socket.gethostbyaddr(self.host)[2][0] if printer: self.printer=printer else: try: self.printer=os.environ['PRINTER'] except KeyError: print "lprClass***Error no printer passed to class and no PRINTER env variable found" sys.exit(2) if self._debug: print "lprClass*** host=",self.host print "lprClass*** user=",self.user print "lprClass*** server=",self.server print "lprClass*** printer=",self.printer # # Create a socket object to communcate with the LPR daemon # if self._trace: print "lprClass***Creating a socketobj instance" self.socketobj=socket.socket(socket.AF_INET, socket.SOCK_STREAM) if self._trace: print "lprClass***Conecting to port 515 on server" self.socketobj.connect((self.server, 515)) if self._trace: print "lprClass***Initializing LPR daemon for job to printer=", self.printer self.socketobj.send("\002"+self.printer+"\012") d=self.socketobj.recv(1024) # # Wait for reply and check response string # errormsg="lprClass***Error initializing communications with LPR daemon" if d != "\000": self._abort(d, errormsg) return def _initcontrol(self, filename): # # Build a control string # control='H'+self.host[:31]+"\012"+'N'+filename[:131]+"\012"+ \ 'P'+self.user[:31]+"\012"+'o'+filename[:131]+"\012" #------------------------------------------------------------------------------------ # Send the receive control file subcommand # if self._trace: print "lprClass***Sending the receive control file subcommand" self.socketobj.send("\002"+str(len(control))+" cfA000"+self.host+"\012") # # Wait for reply and check response string # if self._trace: print "lprClass***Waiting for reply" d=self.socketobj.recv(1024) errormsg="lprClass***Error in control string initialization for LPR daemon" if d != "\000": self._abort(d, errormsg) #------------------------------------------------------------------------------------ # Send the control file # if self._trace: print "lprClass***Sending the control file command" self.socketobj.send(control) self.socketobj.send("\000") # # Wait for reply and check response string # if self._trace: print "lprClass***Waiting for reply" d=self.socketobj.recv(1024) errormsg="lprClass***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.socketobj.recv(1024) errormsg="lprClass***Error in _closelpr" if d != "\000": self._abort(d, errormsg) # # Close the socket connection # self.socketobj.close() return def _sendheader(self, length): #------------------------------------------------------------------------------------ # Send the receive data file subcommand # if self._trace: print "lprClass***Sending the receive data file subcommand" self.socketobj.send("\003"+str(length)+" dfA000"+self.host+"\012") # # Wait for reply and check response string # if self._trace: print "lprClass***Waiting for reply" d=self.socketobj.recv(1024) errormsg="lprClass***Error in receive data file subcommand for LPR daemon" if d != "\000": self._abort(d, errormsg) return def queuefile(self, filename): try: ifile=open(filename,'r') except: print "lprClass***Unable to find filename=%s to print" % filename return # # Call routine to initialize LPR daemon with control information # self._initcontrol(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***queuefile-length=",length # # Send file header to LPR # self._sendheader(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(self, string): # # Call routine to initialize LPR daemon with control information # self._initcontrol('') self._sendheader(len(string)) self.socketobj.send(string) self._closelpr() return if __name__=="__main__": 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')
-- http://mail.python.org/mailman/listinfo/python-list