Ошибка импорта изображения PIL

У меня установлены модули Pillow и qrcode в виртуальной среде.

Из оболочки python я могу программно создать тестовый образ с помощью PIL:

>>> from PIL import Image
>>> img = Image.new('1', (200, 200))
>>> img.save('test-image.jpeg', 'JPEG')

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

>>> import qrcode
>>> qr_code = qrcode.make("1") 
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/home/vagrant/.virtualenvs/env1/local/lib/python2.7/site-packages/qrcode/main.py", line 8, in make
     return qr.make_image()
   File "/home/vagrant/.virtualenvs/env1/local/lib/python2.7/site-packages/qrcode/main.py", line 186, in make_image
     from qrcode.image.pil import PilImage
   File "/home/vagrant/.virtualenvs/env1/local/lib/python2.7/site-packages/qrcode/image/pil.py", line 5, in <module>
     import Image
ImportError: No module named Image

Почему qrcode не может импортировать класс PIL Image, но он работает из оболочки?


person Marc Wilson    schedule 01.10.2013    source источник
comment
Это немного вслепую, но… работает ли from PIL import ImageDraw на оболочке? Если этот модуль каким-то образом отсутствует в пакете PIL, qrcode предположит, что Image также отсутствует в пакете PIL, и попытается импортировать его с верхнего уровня, что вызовет именно ту проблему, которую вы видите.   -  person abarnert    schedule 02.10.2013
comment
Более вероятно, что вы на самом деле тестируете не в той виртуальной среде. В вашей оболочке после этого from PIL import Image просто введите Image и посмотрите, какой путь он вам даст. Это внутри /home/vagrant/.virtualenvs/env1/blah/blah или нет?   -  person abarnert    schedule 02.10.2013


Ответы (1)


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

import Image

с:

from PIL import Image

в файле qrcode/image/pil.py.

person Stefano Sanfilippo    schedule 01.10.2013
comment
Да, PIL старой школы иногда устанавливается одним способом, иногда другим. Многие люди явно добавляли пакет в sys.path, чтобы обойти это, но это всегда была ужасная идея. Подушка выбрала более разумный вариант и последовательно использовала его, но есть несколько других пакетов, которые ожидают другого. - person abarnert; 02.10.2013
comment
Но… это не сработает. Если вы посмотрите на источник, он уже пытается from PIL import Image и возвращается к import Image только в случае неудачи. - person abarnert; 02.10.2013
comment
В этом случае должно быть что-то не так с вашим virtualenv. Только что проверил, все работает: я запустил virtualenv so && source so/bin/activate && pip install pillow qrcode six && python и набрал import qrcode; qrcode.make("1").show(). Извините за плохое форматирование, подходящее для комментариев. - person Stefano Sanfilippo; 02.10.2013
comment
Я развернул новую бродячую коробку и сделал новую установку всего, и все работает, как и ожидалось. Спасибо, что указали мне правильное направление. - person Marc Wilson; 03.10.2013