将Ghostscript从os.popen转换为subsession.popen python

时间:2012-11-22 07:52:19

标签: python subprocess popen ghostscript

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

我用这种方式试了一下:

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 :(得分:2)

我找到了问题的解决方案。 使用PIL包时,在安装过程中无法正确编译。 之后,我有一个依赖问题。 我通过以下方式修复它:

import PIL.EpsImagePlugin
PIL.EpsImagePlugin.Ghostscript = mioGhostscript

然后我在命令中看到了这个:

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

代码是shell的代码,它在我的系统上不起作用,因为python试图读取一个名为- >/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

我希望这些帖子可以帮助别人。