Printing a file to a printer &/or changing the device that is referred to by stdout

Larry Bates lbates at swamisoft.com
Fri Jul 16 18:53:56 CEST 2004


Jody,

Here is a class that I wrote some time ago that allows you
to print to Linux queue's (you didn't tell us if you are
on Linux, Mac or Windows).  Hope it helps.

#! /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


Larry Bates
Syscon, Inc.


"Jody Burgess" <jody.burgess at sewardconsulting.com> wrote in message
news:266981ce.0407160733.5cca3b6e at posting.google.com...
> Hi;
>   I am writing my first python program and would like to know how to
> change stdout to refer to my default printer or any other printer on
> my network. The other question is, Is there an API set of classes that
> allow me to interact with network devices.
>
> In other words, if I have a path and filename inside of a string
> variable in python, how do I send the file to the printer??
>
> Thanks in advance
>
> Jody Burgess
> jody.burgess at sewardconsulting.com





More information about the Python-list mailing list