Python/perl打印服务器;将打印作业写入文件
我正在尝试使用以下方法运行打印服务器: 我已经修改了spooler.py,将其写入一个文件,并且一切正常,只剩下一个问题:考虑到打印的内容,这项工作似乎花费了很长时间 这项工作得到了接受,并在实际完成之前持续了整整一分钟。对于一个1kb的txt文件来说,这似乎是一个过长的时间,文件中有“test”一词 无论是使用Windows还是Mac,它都表现出相同的行为,因此它不是操作系统的东西 这是spooler.py中修改的defPython/perl打印服务器;将打印作业写入文件,python,printing,asyncore,Python,Printing,Asyncore,我正在尝试使用以下方法运行打印服务器: 我已经修改了spooler.py,将其写入一个文件,并且一切正常,只剩下一个问题:考虑到打印的内容,这项工作似乎花费了很长时间 这项工作得到了接受,并在实际完成之前持续了整整一分钟。对于一个1kb的txt文件来说,这似乎是一个过长的时间,文件中有“test”一词 无论是使用Windows还是Mac,它都表现出相同的行为,因此它不是操作系统的东西 这是spooler.py中修改的def class printer(base_printer): def
class printer(base_printer):
def sendjob(self, fp, title = None):
# title is irrelevant here
print "Begin sendjob def..."
out = open('/tmp/printserv/outs/' + str(time.time()).split('.')[0]+".txt", 'w')
blk = fp.read(8192)
while blk:
out.write(blk)
print "Block written..."
blk = fp.read(8192)
print "while loop done..."
rc = out.close()
if rc is not None:
print "Error: lpr returns %02x" % rc
else:
print "OK DONE"
这是printserver.py中处理作业的主打印处理程序类:
class print_handler(asyncore.dispatcher):
def __init__(self, conn, addr, server, jobnumber):
asyncore.dispatcher.__init__(self, sock = conn)
self.addr = addr
self.server = server
self.jobname = JOBNAME % jobnumber
self.fp = open(self.jobname, "wb")
print "Receiving Job from %s for Printer <%s> (Spool File %s)" \
% (addr, self.server.printer.printer_name, self.jobname)
def handle_read(self):
data = self.recv(8192)
print "Starting handle_read"
if self.fp:
print "begin self.fp.write..."
self.fp.write(data)
print "end self.fp.write.."
def writable(self):
print "Writable return 0"
return 0
def handle_write(self):
print "handle_write pass"
pass
def handle_close(self):
print "Printer <%s>: Printing Job %s" \
% (self.server.printer.printer_name, self.jobname)
if self.fp:
self.fp.close()
self.fp = None
fp = open(self.jobname, "rb")
self.server.printer.sendjob(fp)
fp.close()
try:
os.remove(self.jobname)
except:
print "Can't Remove <%s>" % self.jobname
self.close()
这些打印记录在日志文件中,如下所示:
此时,作业已完成,文件已写入。在进入下一个作业之前,不会记录任何其他内容。正如您所看到的,这花费了1.5分钟来完成
我的问题是:处理1k文件怎么可能需要2分钟?这是所有本地千兆局域网,所以它必须与代码处理工作的方式。。。我注意到的一件事是,打印作业似乎有很多尾随空格。这可能是因为它在寻找EOF或其他东西,最终只是超时
任何指针这都是客户机上打印机配置的问题。它被设置为lpr而不是RAW 巧合的是,我遇到了一个perl脚本,它将做与py脚本类似的事情。使用perl脚本,实现与我的目标相同的目标的代码要少得多,我的目标是捕获流并写入文件;rps比我需要的更详细 在这里:
def mainloop(config):
if config["spooldir"]:
os.chdir(config["spooldir"])
for i in range(len(config["printer"])):
args = string.split(config["printer"][i], ",", maxsplit = 1)
prn = args[1].strip()
port = int(args[0].strip())
p = print_server('',
port, spooler.printer(prn))
servers.append(p)
try:
try:
asyncore.loop(timeout = 1.0)
except KeyboardInterrupt:
pass
finally:
print "Print Server Exit"
[2012/04/26 10:39:58] Raw Print Server Startup: PID = 15695
[2012/04/26 10:39:58] Starting Printer <lpr> on port 515
[2012/04/26 10:40:01] Receiving Job from ('1.2.3.4', 55070) for Printer <lpr> (Spool File RawPrintJob00001.prn)
[2012/04/26 10:40:01] Writable return 0
[2012/04/26 10:40:01] Starting handle_read
[2012/04/26 10:40:01] begin self.fp.write...
[2012/04/26 10:40:01] end self.fp.write..
[2012/04/26 10:40:01] Writable return 0
[2012/04/26 10:40:02] Writable return 0
[2012/04/26 10:40:03] Writable return 0
[2012/04/26 10:40:04] Writable return 0
[[SNIP]]
[2012/04/26 10:41:39] Writable return 0
[2012/04/26 10:41:40] Writable return 0
[2012/04/26 10:41:41] Writable return 0
[2012/04/26 10:41:42] Starting handle_read
[2012/04/26 10:41:42] begin self.fp.write...
[2012/04/26 10:41:42] end self.fp.write..
[2012/04/26 10:41:42] Writable return 0
[2012/04/26 10:41:42] Printer <lpr>: Printing Job RawPrintJob00001.prn
[2012/04/26 10:41:42] Begin sendjob def...
[2012/04/26 10:41:42] Block written...
[2012/04/26 10:41:42] done writing blocks...
[2012/04/26 10:41:42] OK DONE
[2012/04/26 10:41:42] Starting handle_read
#!/usr/bin/perl
use IO::Socket::INET;
use POSIX qw(strftime);
$print_time = strftime "%Y%m%d-%H_%M_%S", localtime;
$myport=515;
$pserve=IO::Socket::INET->new(LocalPort => $myport,Type=>SOCK_STREAM,Reuse=>1,Listen=>1) or die "Socket error: $!\n";
while ($pjob=$pserve->accept()) {
open(J,">>/tmp/printserv/outs/".$print_time.".txt") or print "File open error: $!\n";
while (<$pjob>) {
print J "$_";
}
close J;
close $pjob;
print "DONE...";
}