[python-win32] win32print
Guy Robinson
guy at r-e-d.co.nz
Sat Nov 29 03:41:00 EST 2003
Hello,
I've got this working print queue montior and currently it checks the
queues every 1 second. I'm worried that I might miss events if I set in
to more than this. Particularly as I would like to perform functions
depending on status codes. When I don't have a delay in the CPU usage is
huge 70%.
My question is, is there an 'intelligient' way of monitoring the
spooler? I guess what I'm thinking is some low cpu method of watching
for activity on the spooler, and triggering my program as the spooler
stops and starts.
Suggestions?
Regards,
Guy
Here's my code so far:
try:
import win32print
except:
print 'win32all required .'
import time
#constants
wp = win32print
# lists and dicitonaries of constants
ptypelist =
[(wp.PRINTER_ENUM_SHARED,'shared'),(wp.PRINTER_ENUM_LOCAL,'local'),(wp.PRINTER_ENUM_CONNECTIONS,'network')]
cmds = {'Pause':wp.JOB_CONTROL_PAUSE, 'cancel':wp.JOB_CONTROL_CANCEL,
'resume':wp.JOB_CONTROL_RESUME,
'prior_low':wp.MIN_PRIORITY,'prior_high':wp.MAX_PRIORITY,'prior_normal':wp.DEF_PRIORITY
}
statuscodes =
{'deleting':wp.JOB_STATUS_DELETING,'error':wp.JOB_STATUS_ERROR,'offline':wp.JOB_STATUS_OFFLINE,'paper
out':wp.JOB_STATUS_PAPEROUT,'paused':wp.JOB_STATUS_PAUSED,'printed':wp.JOB_STATUS_PRINTED,'printing':wp.JOB_STATUS_PRINTING,'spooling':wp.JOB_STATUS_SPOOLING}
class PMFuncs:
def __init__(self):
# initialise the list of printers
self.PList =[]
def PrinterList(self):
# returns a list of dicts.
# this gets the default printer
tmpdic ={}
DefPName = win32print.GetDefaultPrinter()
# Get the default printer firstso we can add this to the list
of printers
for pt in ptypelist:
try:
for (Flags,pDescription,pName,pComment) in
list(win32print.EnumPrinters(pt[0],None,1)):
tmpdic ={}
tmpdic['PType'] = pt[1]
tmpdic['Flags'] = Flags
tmpdic['Description'] = pDescription
#test for if this is the default printer
if pName == DefPName:
tmpdic['DefPrinter':True]
else:
tmpdic['DefPrinter':False]
tmpdic['Name'] = pName
tmpdic['Comment'] = pComment
self.PList.append(tmpdic)
except:
pass #no printers of this type so don't add anything
return self.PList #list of installed printers
def GetJobList(self,printer):
phandle = win32print.OpenPrinter(printer)
#now get all the print jobs (start at job 0 and -1 for all jobs)
jlist = win32print.EnumJobs(phandle,0,-1,1)
win32print.ClosePrinter(phandle)
return jlist # this lists all jobs on all printers
def GetJobInfo(self,printer,jobID):
phandle = win32print.OpenPrinter(printer)
ilist = win32print.GetJob(phandle,jobID,1)
win32print.ClosePrinter(phandle)
return ilist #this lists all info available at level 1 for
selected job.
def SetJobCmd(self, printer, jobID , JobInfo , RCmd ):
phandle = win32print.OpenPrinter(printer)
win32print.SetJob(phandle,jobID,1,JobInfo,Cmds[RCmd])
win32print.ClosePrinter(phandle)
# test functions
e = PMFuncs()
while 1:
time.sleep(1)
e = PMFuncs()
for i in e.PrinterList():
try:
p = e.GetJobList(i['Name'])
for w in p:
print e.GetJobInfo(i['Name'],w['JobID'])
except:
pass
More information about the Python-win32
mailing list