2012-04-26 171 views
1

我正在试图让使用该运行的打印服务器:http://newcenturycomputers.net/projects/rawprintserver.htmlPython/perl打印服务器;编写打印作业到文件

我修改spooler.py写入一个文件,一切工作正常保存一个问题:工作似乎需要时间考虑正在打印什么......

工作得到收到,它在实际完成之前一直坚持一分钟。这似乎是一个非常长的时间,在它的词“测试” 1KB的txt文件...

它具有相同的行为是否使用Windows或Mac,所以它不是一个操作系统的事情......

这是spooler.py修改后的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() 

和主循环DEF(ALS在printserver.py O):

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" 

那些print的得到记录在日志文件中,看起来像这样:

[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 

在这一点上,在完成作业和文件已被写入。在下一份工作进入之前,没有别的东西会被记录下来。正如你所看到的,这需要1.5分钟才能完成。

我的问题是:如何处理1k文件可能需要将近2分钟?这在千兆局域网上都是本地的,所以它必须是代码处理工作的方式......我注意到的一件事是打印的作业似乎有很多尾随的空白。难道是它正在寻找一个EOF或者什么,最终只是超时?

任何指针赞赏

回答

0

事实证明,这是与打印机是如何在客户端上配置的问题。它被设置为lpr而不是RAW。

巧合的是,我遇到了一个perl脚本,它将执行与py脚本相同的操作(有点儿)。使用perl脚本,实现相同目标的代码要少得多(我的目标是简单地捕获流并写入文件; rps比我需要的冗长)。

这里:

#!/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..."; 
}