2012-11-22 56 views
3

我需要为Ghostscript创建一个Monkey补丁,我必须从os.popen迁移到subsession.popen,因为我无法在我的系统中使用shell。将Ghostscript从os.popen转换为subsession.popen python

我尝试了这种方式:

def mioGhostscript(tile, size, fp): 
    """Render an image using Ghostscript (Unix only)""" 

    # Unpack decoder tile 
    decoder, tile, offset, data = tile[0] 
    length, bbox = data 

    import tempfile, os 

    file = tempfile.mktemp() 

    # Build ghostscript command 
    command = ["gs", 
     "-q",     # quite mode 
     "-g%dx%d" % size,  # set output geometry (pixels) 
     "-dNOPAUSE -dSAFER",  # don't pause between pages, safe mode 
     "-sDEVICE=ppmraw",  # ppm driver 
     "-sOutputFile=%s" % file,# output file 
     "- >/dev/null 2>/dev/null" 
    ] 

    #command = shlex.split(string.join(command)) 
    # push data through ghostscript 

    try: 
     #gs = os.popen(command, "w") 

     args = command#['gs','-dSAFER','-dNOPAUSE','-dBATCH','-sDEVICE=jpeg','-sOutputFile=/home/user/output2.jpg /home/user/downloads/test.pdf'] 
     gs = subprocess.Popen(args, stdout = PIPE, stderr = STDOUT, stdin=PIPE) 
     # adjust for image origin 
     if bbox[0] != 0 or bbox[1] != 0: 
      #gs.write("%d %d translate\n" % (-bbox[0], -bbox[1])) 
      gs.stdin.write("%d %d translate\n" % (-bbox[0], -bbox[1])) 
     fp.seek(offset) 
     while length > 0: 
      s = fp.read(8192) 
      if not s: 
       break 
      length = length - len(s) 
      raise Exception(s) 
      gs.stdin.write(s) 
     gs.communicate()[0] 
     status = gs.stdin.close() 
     #status = gs.close() 
     #if status: 
     # raise IOError("gs failed (status %d)" % status) 
     im = Image.core.open_ppm(file) 
    finally: 
     try: os.unlink(file) 
     except: pass 

    return im 

import PIL 
PIL.EpsImagePlugin.Ghostscript = mioGhostscript 

,但我有这个回溯:

Traceback (most recent call last): File "/home/web/lib/driver_mod_python.py", line 252, in handler buf = m.__dict__[pard['program']](pard) File "/home/dtwebsite/bin/cms_gest_ordini.py", line 44, in wrapped return func(pard) File "/home/dtwebsite/bin/cms_gest_ordini.py", line 95, in wrapped return func(pard) File "/home/dtwebsite/bin/cms_gest_picking_list.py", line 341, in picking_list tr_modelllo = render_row_picking_list(pard, item, picked=0, plist_allowed=plist_allowed) File "/home/dtwebsite/bin/cms_gest_picking_list.py", line 432, in render_row_picking_list aa = a.tostring() File "/rnd/apps/interpreters/python-2.5.6/lib/python2.5/site-packages/PIL/Image.py", line 532, in tostring self.load() File "/rnd/apps/interpreters/python-2.5.6/lib/python2.5/site-packages/PIL/EpsImagePlugin.py", line 283, in load self.im = Ghostscript(self.tile, self.size, self.fp) File "/home/dtwebsite/bin/cms_gest_picking_list.py", line 64, in mioGhostscript gs.stdin.write(s) IOError: [Errno 32] Broken pipe 

有人能帮助我吗?

+1

添加完整的追踪,否则它只是猜测 –

+0

'subsession.popen'唯一参考我可以找到[你的问题在这里](http://www.google.com/search?&as_epq=subsession + POPEN)。你愿意解释它是什么吗? – mata

+0

这是PIL模块Ghostscripts的猴子补丁..我尝试重写这个cose而不使用shell,因为我无法在我的系统中使用它... – torre87

回答

2

我发现问题的解决方案。 它与PIL包一样,在安装过程中没有正确编译。 之后,我有一个依赖关系问题。 我固定它通过以下方式:

import PIL.EpsImagePlugin 
PIL.EpsImagePlugin.Ghostscript = mioGhostscript 

然后我在命令中看到这一点:

"- >/dev/null 2>/dev/null" 

的代码是一个shell的代码,并因为巨蟒试图将它没有我的系统上运行阅读一个字面上名为- >/dev/null 2>/dev/null的文件,它不存在。

我更换

"- >/dev/null 2>/dev/null" 

"-" 

和程序现在从stdin读取。

最后的代码是:

def mioGhostscript(tile, size, fp): 
    """Render an image using Ghostscript (Unix only)""" 

    # Unpack decoder tile 
    decoder, tile, offset, data = tile[0] 
    length, bbox = data 

    import tempfile, os 

    file = tempfile.mktemp() 

    # Build ghostscript command 
    command = ["gs", 
     "-q",     # quite mode 
     "-g%dx%d" % size,  # set output geometry (pixels) 
     "-dNOPAUSE -dSAFER",  # don't pause between pages, safe mode 
     "-sDEVICE=ppmraw",  # ppm driver 
     "-sOutputFile=%s" % file,# output file 
     "-" 
    ] 

    #command = shlex.split(string.join(command)) 
    # push data through ghostscript 

    try: 
     #gs = os.popen(command, "w") 

     args = command#['gs','-dSAFER','-dNOPAUSE','-dBATCH','-sDEVICE=jpeg','-sOutputFile=/home/user/output2.jpg /home/user/downloads/test.pdf'] 
     gs = subprocess.Popen(args, stdout = PIPE, stderr = STDOUT, stdin=PIPE) 
     # adjust for image origin 
     if bbox[0] != 0 or bbox[1] != 0: 
      #gs.write("%d %d translate\n" % (-bbox[0], -bbox[1])) 
      gs.stdin.write("%d %d translate\n" % (-bbox[0], -bbox[1])) 
     fp.seek(offset) 
     while length > 0: 
      s = fp.read(8192) 
      if not s: 
       break 
      length = length - len(s) 
      gs.stdin.write(s) 
     gs.communicate()[0] 
     status = gs.stdin.close() 
     #status = gs.close() 
     #if status: 
     # raise IOError("gs failed (status %d)" % status) 
     im = Image.core.open_ppm(file) 
    finally: 
     try: os.unlink(file) 
     except: pass 

    return im 

import PIL.EpsImagePlugin 
PIL.EpsImagePlugin.Ghostscript = mioGhostscript 

我希望这个帖子能帮助别人。