2013-09-24 1 views
0

Я использую пакет elaphe для python для генерации изображений штрих-кода ean-13. Пакет был установлен из источника, используя tar-файл, найденный по адресу https://pypi.python.org/pypi/elaphe.Python Barcode Generation

Когда я запускаю код:

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 

из интерпретатора, кажется, работает отлично. Правильный штрих-код генерируется в указанном мной пути. Когда я запускаю его из апача, используя web.py как мой веб-рамки я получаю сообщение об ошибке:

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) 

Кто-нибудь знает, что может быть причиной этой ошибки или, как идти об отладке это?

+0

находятся на одной машине? Если нет, уверены ли вы, что на веб-сервере установлен скрипт-призрак? – tacaswell

+0

Yup, я запустил его на той же машине и установлен ghostscript. Я даже стал пользователем www-data и работал так же, как и работал. Я весь день царапаю голову над этим. –

+1

iirc, эти вещи (webservers running scripts) имеют тенденцию запускаться с действительно ограниченными переменными окружения, у вас может быть проблема с пути. (Кроме того, я думаю, что ошибка 256 действительно является ошибкой -1, отмытой через uint. – tacaswell

ответ

-1

Эта ошибка может быть вызвана, если barcode недействителен. Вы должны сначала убедиться, что это то, что вы ожидаете. например. распечатать или записать его в файл или использовать отладчик

+0

Когда вопрос конкретно включает в себя «или как его отладить?», Указание OP «использовать отладчик» вообще не помогает. –

+0

@ JoeFrambach, вы предлагаете, чтобы отладчик не был полезен для отладки? Важная часть, чтобы проверить, что 'barcode' является действительным. Я просто предложил 3 способа проверить его –

+0

Я предлагаю, чтобы ваш ответ не учил человека использовать отладчик или проверить, что штрих-код действителен. –

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 

You» ищу: Сначала: выход «product_barcode: ...». Надеюсь, это не пусто. Если это так, тогда проблема кроется в другом месте, может быть, в конфигурации вашего сервера. Затем вывод «img data: ...». Надеюсь, это png, а не пусто. Если он пуст, проблема связана с установкой ghostscript.

Это очень рудиментарный способ отладки, и я чувствую, что для небольших проектов так же легко вставлять некоторые отладочные заявления, а не вмешиваться в отладчик, что может быть сложно настроить должным образом.

+0

Это очень помогает. Я никогда не был уверен, как печатать при использовании веб-сервера. Я всегда создавал базу данных журналов, которая сильно замедляет приложение. Кажется, все указывает на GhostScript, поэтому я попробую переустановить его. Мне просто кажется странным, почему он работает нормально, но не на веб-сервере. Я не мог найти никаких проблем с путями, которые могли бы привести к сбою. –

1

Трассировка стека предполагает, что изображение, возвращаемое barcode(), является PostScript. Затем PIL пытается запустить GhostScript (gs), чтобы преобразовать изображение в желаемый формат вывода PNG.

Если посмотреть в description of elaphe, вы видите, что он говорит:

It generates barcode symbol as PostScript code fragment using BWIPP.

ли вы установили GhostScript?

Это, я предлагаю вам попробовать pyBarcode, так как он не имеет никакой зависимости, кроме PIL.

+0

GhostScript определенно установлен. Я дважды проверю, чтобы убедиться, что он полностью обновлен и работает правильно. Сначала я использовал pyBarcode, но перешел в elaphe, так как текстовый формат в нижней части штрих-кода кажется стандартной компоновкой. –

+0

Было бы неплохо, если бы PIL напечатал вывод 'gs'; это, вероятно, не подводит молча. Если можно, отредактируйте исходный код и добавьте информацию о регистрации/отладке (например, аргументы, которые использовались для вызова 'gs'). –