Python qrcode не соответствует

У меня очень странная проблема с python-qrcode.

У меня он уже некоторое время работает в нашей среде разработки, без каких-либо проблем. Мы используем его для создания двух QR-кодов, каждый из которых содержит URL-адреса почти одинаковой длины (один содержит лишнюю букву и две лишние косые черты). Крайне важно, чтобы эти два кода были одинакового размера.

С тех пор, как мы настроили python-qrcode около пяти месяцев назад, каждый сгенерированный нами qrcode в обязательном порядке был точно такого же размера. Однако теперь мы переместили все на рабочий сервер, и вдруг у нас возникла проблема.

По сути, один из генерируемых нами кодов больше обычного (это код с тремя дополнительными символами). Другой код - правильный размер. Два кода генерируются с использованием одной и той же функции, мы просто передаем разные URL-адреса для кодирования.

На моем локальном компьютере и на нашем сервере разработки все qr-коды имеют одинаковый размер (включая код с дополнительными символами), но на рабочем сервере более длинный код больше, а другой правильный.

Мы используем контроль версий Git, поэтому все файлы/функции и т. д. идентичны между серверами. Единственная разница между настройками — это версия Ubuntu (12.04 против 12.10 на рабочем сервере), но я не понимаю, почему это может вызвать эту проблему.

Если бы оба кода были больше, я бы понял, но я не могу понять, почему один будет больше другого только на одном сервере.....?

Если кто-то может подсказать, с чего начать, буду очень признателен!

РЕДАКТИРОВАТЬ:

Вот соответствующий код:

myQrGenerator = qrcode.QRCode(
    version=QRCODE_SIZE,
    error_correction=qrcode.constants.ERROR_CORRECT_M,
    box_size=QRCODE_BOX_SIZE,
    border=QRCODE_BORDER_SIZE
)

myQrGenerator.add_data('%s%s/' % (theBaseUrl, str(theHash)))
myQrGenerator.make(fit=True)

Мы получаем эти переменные из local_settings.py.


person Erve1879    schedule 03.12.2012    source источник
comment
Когда вы говорите размер, вы имеете в виду размер файла полученного изображения?   -  person soulseekah    schedule 03.12.2012
comment
Извините - да. Результирующий размер изображения от края до края.   -  person Erve1879    schedule 03.12.2012
comment
Покажите соответствующий код, например, как вы используете API python-qrcode.   -  person soulseekah    schedule 03.12.2012
comment
При вызове через make по умолчанию, python-qrcode пытается соответствовать данные и, возможно, изменить размер изображения. Используйте print_tty для вывода кодов на экран, чтобы полностью избежать PIL и исключить его неправильное поведение.   -  person soulseekah    schedule 03.12.2012
comment
Кроме того, какая разница? Один пиксель QR в ширину и высоту? Несколько необработанных пикселей изображения? Может быть, вы можете показать и сами изображения, и закодированные строки, чтобы мы могли попробовать это сами?   -  person soulseekah    schedule 03.12.2012
comment
Сейчас попробую, спасибо soulseekah   -  person Erve1879    schedule 03.12.2012
comment
Разница в том, что изображение на 50 пикселей (необработанные пиксели изображения) больше в обоих измерениях.   -  person Erve1879    schedule 03.12.2012
comment
Являются ли пиксели QR внутри одного и того же числа или они просто больше? Если они есть, похоже на проблему с PIL, хотя я пока не могу представить, почему и как. Сверху загружаются несколько переменных, здесь github.com/lincolnloop/python-qrcode/blob/master/qrcode/image/ возможно, вы можете выполнить этот код на обеих машинах, чтобы узнать разницу в переменных и перейти к источнику этих переменных .   -  person soulseekah    schedule 03.12.2012
comment
Пиксели QR имеют одинаковый размер — в неправильном коде их больше (да и раскладка сильно отличается). Несмотря на это, оба кода приводят к одному и тому же URL-адресу.   -  person Erve1879    schedule 03.12.2012
comment
Таким образом, похоже, что это не проблема PIL, если поля QR имеют одинаковый размер, но их больше, PIL делает то, что говорит. Я могу предположить, что print_tty на двух машинах дает одинаковое поведение, в то время как 12.10 создает более крупный QR-код (с большим количеством полей) для более длинного URL-адреса. И что касается кодов, оба приводят к одному и тому же URL-адресу, позвольте мне уточнить, при сканировании кодов вы получаете одни и те же данные, даже если вы вводили разные данные!?   -  person soulseekah    schedule 03.12.2012
comment
Я согласен, что это не похоже на проблему PIL. Вам придется помочь мне с print.tty - я получил неверную синтаксическую ошибку. Тот же бит URL-адреса: когда я ввожу один и тот же URL-адрес на разные серверы, рабочий сервер возвращает QR-код большего размера, но он содержит тот же URL-адрес, что и код, сгенерированный сервером разработки (это правильный размер)   -  person Erve1879    schedule 03.12.2012


Ответы (2)


После продолжительного обсуждения было установлено, что два сервера используют разные URL-адреса. Тот, который извергал больший QR-код (в пересчете на пиксели QR, а впоследствии и на пиксели изображения) переполнялся, где предела битов, которые он мог хранить для предопределенного размера, было недостаточно, и qrcode подгонял его, увеличивая размер объем данных, которые он может хранить.

Чтобы исправить это, fit было установлено False для ограничения переполнения, а version было увеличено, чтобы с самого начала вмещать больше битов. box_size можно немного уменьшить, чтобы более или менее сохранить исходный размер изображения.

person soulseekah    schedule 03.12.2012

Вероятно, разница в том, как PIL установлен на коробке. Глядя на исходный код python-qrcode, он делает:

try:
    from PIL import Image, ImageDraw
except ImportError:
    import Image, ImageDraw

Посмотрите, что происходит, когда вы делаете:

from PIL import Image, ImageDraw

На каждой машине. В любом случае, если это действительно не ошибка в коде приложения (дважды убедитесь, что один и тот же код находится в каждой коробке), похоже, что это будет из-за некоторой разницы в том, как PIL строится в Ubuntu 12.10 и 12.04, вероятно, из-за некоторых разных заголовков/библиотек, которые он использует для компиляции. Позаботьтесь о том, чтобы установка PIL соответствовала другим блокам.

person Purrell    schedule 03.12.2012
comment
Спасибо, Purrell - предположительно, мне нужно быть в оболочке Python? Я не получил ответа (ошибка или что-то еще), когда я запустил это в оболочке Python - person Erve1879; 03.12.2012