【问题标题】:Python Barcode GenerationPython 条码生成
【发布时间】:2013-09-24 15:42:33
【问题描述】:

我正在使用 Python 的 elaphe 包来生成 ean-13 条形码图像。该软件包是使用位于 https://pypi.python.org/pypi/elaphe 的 tar 文件从源代码安装的。

当我运行代码时:

BARCODE_IMAGE_PATH = "/tmp/"

def create_barcode_image(product_barcode):

    path = BARCODE_IMAGE_PATH + product_barcode + '.png'

    img = barcode('ean13', product_barcode, 
                  options=dict(includetext=True, height=0.4), margin=1)
    img.save(path, 'PNG')

    return path 

从 python 解释器看来,它工作得很好。正确的条形码生成到我指定的路径。当我使用 web.py 作为我的 web 框架从 apache 运行它时,我收到错误:

Traceback (most recent call last):
  ...
     img_path = create_barcode_image(barcode)
   File "/var/www/py/documents/barcode_images.py", line 27, in create_barcode_image
     img.save(path, 'PNG')
   File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 1406, in save
     self.load()
   File "/usr/local/lib/python2.7/dist-packages/PIL/EpsImagePlugin.py", line 283, in load
     self.im = Ghostscript(self.tile, self.size, self.fp)
   File "/usr/local/lib/python2.7/dist-packages/PIL/EpsImagePlugin.py", line 75, in Ghostscript
     raise IOError("gs failed (status %d)" % status)
 IOError: gs failed (status 256) 

有谁知道可能导致此错误的原因或如何调试它?

【问题讨论】:

  • 这些是在同一台机器上吗?如果没有,您确定您在网络服务器上安装了 ghost 脚本吗?
  • 是的,我在同一台机器上运行它并安装了 ghostscript。我什至成为了 www-data 用户并以同样有效的方式运行它。我整天都在为这个问题挠头。
  • iirc,这些东西(运行脚本的网络服务器)往往会在真正受限的环境变量下运行,你可能有路径问题。 (另外,我认为错误 256 确实是通过 uint 清洗的错误 -1。

标签: python barcode ghostscript elaphe


【解决方案1】:

添加一些您可以通过的调试语句:

import sys

BARCODE_IMAGE_PATH = "/tmp/"

def create_barcode_image(product_barcode):

    print >> sys.stderr, "product_barcode: %s" % product_barcode

    path = BARCODE_IMAGE_PATH + product_barcode + '.png'

    print >> sys.stderr, "path: %s" % path

    img = barcode('ean13', product_barcode, 
                  options=dict(includetext=True, height=0.4), margin=1)

    print >> sys.stderr, "img data: %s" % img.tostring()

    img.save(path, 'PNG')

    print >> sys.stderr, "Saved to %s" % path

    return path 

然后在你的外壳中:

$ tail -F /var/log/httpd/error.log # or wherever you put it

您正在寻找:首先:“product_barcode: ...”的输出。希望这不是空白。如果是,那么问题出在其他地方,可能在您的服务器配置中。然后是“img data: ...”的输出。希望它是一个png而不是空白。如果它是空白的,那么问题出在你的 ghostscript 安装上。

这是一种非常初级的调试方式,我觉得对于小型项目来说,加入一些调试语句同样容易,而不是乱搞调试器,因为调试器很难正确设置。

【讨论】:

  • 这很有帮助。使用网络服务器时,我从来不知道如何打印。我总是最终创建了一个日志数据库,这大大降低了应用程序的速度。一切似乎都指向 GhostScript,所以我会尝试重新安装它。我只是觉得奇怪为什么它可以正常工作但不能在 Web 服务器上工作。我找不到任何会导致失败的路径问题。
【解决方案2】:

堆栈跟踪表明barcode() 返回的图像是 PostScript。然后 PIL 尝试运行 GhostScript (gs) 将图像转换为所需的输出格式PNG

如果您查看description of elaphe,您会看到它说:

它使用 BWIPP 生成条形码符号作为 PostScript 代码片段。

您是否安装了 GhostScript?

也就是说,我建议你改用pyBarcode,因为它除了 PIL 之外没有任何依赖项。

【讨论】:

  • GhostScript 肯定已经安装了。我会仔细检查以确保它完全是最新的并且工作正常。我最初使用的是 pyBarcode,但由于条形码底部的文本格式似乎是标准布局,所以我改用了 elaphe。
  • 如果 PIL 能打印gs 的输出就好了;它可能不会默默地失败。如果可以,请编辑源代码并添加一些日志记录/调试信息(例如用于调用 gs 的参数)。
【解决方案3】:

如果barcode 无效,可能会导致此错误。您应该首先确保它是您所期望的。例如。将其打印出来,或将其写入文件或使用调试器

【讨论】:

  • 当问题具体包括“或者如何调试它?”时,告诉 OP“使用调试器”根本没有帮助。
  • @JoeFrambach,你是说调试器对调试没有用吗?检查barcode 是否有效的重要部分。我只是建议了 3 种方法来检查它
  • 我的意思是,您的回答不会教人使用调试器或检查条形码是否有效。
  • @JoeFrambach,当然不是。那将超出问题的范围。我不知道斯图尔特的经验水平,所以我建议先使用print
猜你喜欢
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2012-03-30
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多