ImportError не может импортировать имя BytesIO при импорте кофе в Ubuntu

Я пытаюсь запустить caffe на моей машине с Ubuntu 12.04LTS. Выполнив все шаги на странице установки, я успешно обучил модель LeNet и попытался использовать ее в качестве руководства из здесь. Затем я получил следующую ошибку:

Traceback (most recent call last): 
    File "<string>", line 1, in <module>
ImportError: No module named caffe
Error in sys.excepthook:
Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook
      from apport.fileutils import likely_packaged, get_recent_crashes
    File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in <module>
      from apport.report import Report
    File "/usr/lib/python2.7/dist-packages/apport/report.py", line 18, in <module>
      import problem_report
    File "/usr/lib/python2.7/dist-packages/problem_report.py", line 14, in <module>
      import zlib, base64, time, sys, gzip, struct, os
    File "/usr/lib/python2.7/gzip.py", line 10, in <module>
      import io
    File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in <module>
      import skimage.io
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in <module>
      from ._io import *
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in <module>
      from io import BytesIO
ImportError: cannot import name BytesIO

Original exception was:
Traceback (most recent call last): 
    File "<string>", line 1, in <module>
ImportError: No module named caffe

Я установил PYTHONPATH в файле .bashrc до того, как сделал вышеописанное. В чем проблема? Кто-нибудь может подсказать? Я действительно смущен. После запуска команды python -c 'import io; print io.__file__' в той же директории:

Traceback (most recent call last): 
    File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in <module>
      import skimage.io
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in <module>
      from ._io import *
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in <module>
      from io import BytesIO
ImportError: cannot import name BytesIO
Error in sys.excepthook:
Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in apport_excepthook
      from apport.fileutils import likely_packaged, get_recent_crashes
    File "/usr/lib/python2.7/dist-packages/apport/__init__.py", line 1, in <module>
      from apport.report import Report
    File "/usr/lib/python2.7/dist-packages/apport/report.py", line 18, in <module>
      import problem_report
    File "/usr/lib/python2.7/dist-packages/problem_report.py", line 14, in <module>
      import zlib, base64, time, sys, gzip, struct, os
    File "/usr/lib/python2.7/gzip.py", line 10, in <module>
      import io
    File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in <module>
      import skimage.io
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in <module>
      from ._io import *
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in <module>
      from io import BytesIO
ImportError: cannot import name BytesIO

Original exception was:
Traceback (most recent call last): 
    File "${HOME}/path/to/caffe/python/caffe/io.py", line 2, in <module>
      import skimage.io
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/__init__.py", line 11, in <module>
      from ._io import *
    File "/usr/local/lib/python2.7/dist-packages/skimage/io/_io.py", line 1, in <module>
      from io import BytesIO
ImportError: cannot import name BytesIO

Таким образом, возникает проблема: как решить проблему с именем? P.S.: Я также добавил задачу в репозиторий caffe.


person stoneyang    schedule 10.12.2014    source источник


Ответы (2)


Похоже, у вас есть пакет или модуль с именем io в вашем пути Python, который маскирует пакет стандартной библиотеки. Вместо этого он импортируется, но не имеет объекта BytesIO для импорта.

Попробуйте запустить:

python -c 'import io; print io.__file__'

в том же месте, где вы запускаете учебник, и переименуйте или переместите файл, названный этим импортом, предполагая, что это не стандартная версия библиотеки (оканчивающаяся на lib/python2.7/io.pyc).

Возможно, вы указали путь Python к неправильному каталогу. Вы должны включить path/to/caffe/python, а не path/to/caffe/python/caffe, и вы не должны пытаться запускать python с последним в качестве вашего текущего рабочего каталога. В обоих случаях caffe/python/caffe/io.py вместо стандартной версии библиотеки.

Инструкции по установке здесь не виноваты; они ясно говорят вам использовать:

export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH

Обратите внимание на отсутствие /caffe в конце этого пути.

person Martijn Pieters    schedule 10.12.2014
comment
Привет, @Martijn Pieters, я запустил команду и получил ошибку, аналогичную исходному сообщению. Но на этот раз я уверен, что проблема кроется в файле io.py в каталоге caffe или в файле _io.py skimage. Однако я не знаю, как это исправить.... - person stoneyang; 10.12.2014
comment
@stoneyang: ты запускаешь caffe/io.py как скрипт? - person Martijn Pieters; 10.12.2014
comment
@stoneyang: в своем отчете об ошибке вы говорите, что установили PYTHONPATH; на что ты его поставил? Включает ли он ${HOME}/path/to/caffe/python/caffe? - person Martijn Pieters; 10.12.2014
comment
@stoneyang: похоже, вы действительно импортируете caffe/io.py, что наводит на мысль, что вы поместили этот каталог в свой PYTHONPATH; это было бы неправильно. Сейчас проверяю учебник. - person Martijn Pieters; 10.12.2014
comment
Привет, @Martijn Pieters, спасибо за ваши усилия по моей проблеме. Это настройка PYTHONPATH=${HOME}/path/to/caffe/python/caffe:$PYTHONPATH в исходном посте. Это было не правильно. И я попробовал новые настройки, как вы предложили, и это не помогло --- получил ту же ошибку. После этого я даже переместил каталог из caffe, т.е. в каталог ${HOME}, и перенаправил PYTHONPATH на новое место назначения. Однако все равно не повезло :( - person stoneyang; 10.12.2014
comment
@stoneyang: что сейчас показывает echo $PYTHONPATH? Вы, вероятно, расширили переменную, чтобы она читала что-то вроде ${HOME}/path/to/caffe/python:${HOME}/path/to/caffe/python/caffe:...., поэтому добавили правильный путь, но неправильный путь все еще существует. - person Martijn Pieters; 10.12.2014
comment
@Мартиджин Питерс, спасибо за вашу любезную помощь. В конце концов я не решил эту проблему чисто --- я просто набираю команду export каждый раз, когда мне нужно запустить caffe! - person stoneyang; 13.12.2014
comment
@stoneyang: вы также можете поместить часть PYTHONPATH=... перед командой python в своей оболочке. PYTHONPATH=... python somescript.py; Это будет применяться только для этой команды каждый раз. - person Martijn Pieters; 13.12.2014
comment
@Мартиджин Питерс, вот что я сделал! ;-) - person stoneyang; 14.12.2014

Я также столкнулся с этой проблемой, установив caffe на экземпляр AWS ubuntu 14.04, следуя сценарию, описанному в репозитории BVLC github здесь: "Кафе в EC2 Ubuntu 14.04".

Я настроил путь python в соответствии с инструкциями. Как диагностировал @Martijn Pieters, проблема заключается в том, что caffe импортирует свою собственную библиотеку ввода-вывода, которая затем импортирует библиотеку ввода-вывода scikit-image, которая, в свою очередь, пытается (но безуспешно) загрузить стандартную библиотеку ввода-вывода Python (где находится BytesIO ). Вместо этого из-за пути python, когда scikit-image пытается импортировать BytesIO из модуля io, он циклически возвращается к модулю io caffe.

Я также обнаружил, что даже когда я не пытался импортировать caffe, но из-за того, что мой путь python включал caffe, эта же проблема возникает в другом месте.

Вероятно, есть несколько способов решить эту проблему. Но суть в том, что виноват импорт кофе на высшем уровне. Чтобы убедиться в этом, я изменил код caffe следующим образом:

  1. Я переименовал модуль .../caffe/io.py в .../caffe/caffe_io.py, чтобы быть в безопасности (хотя при правильном уходе за пространством имен в этом нет необходимости)

  2. Я изменил импорт в верхней части модуля pycaffe.py с: import caffe.io на import caffe.caffe_io.

  3. Я изменил импорт в __init__.py таким же образом (с import caffe.io на import caffe.caffe_io)

Теперь, когда вы импортируете io из python, он не подберет библиотеку io в caffe. Когда вы импортируете caffe, он импортирует свою пользовательскую библиотеку caffe_io, и все должно быть хорошо. Возможно, вы захотите выполнить более тщательное сканирование модулей python caffe, чтобы убедиться, что я не упустил из виду другие места, где необходимо изменить импорт.

Надеюсь, это поможет. Возможно, когда у меня будет время, я отправлю запрос на включение этих (или подобных) изменений в репозиторий caffe github.

person svohara    schedule 09.12.2015