【问题标题】:ImportError cannot import name BytesIO when import caffe on ubuntu在 ubuntu 上导入 caffe 时 ImportError 无法导入名称 BytesIO
【发布时间】:2015-02-08 09:23:14
【问题描述】:

我正在尝试让caffe 在配备 Ubuntu 12.04LTS 的机器上运行。 完成Installation page上的所有步骤后,我成功训练了LeNet模型,并尝试将其用作here的教程。然后我得到以下错误:

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

在执行上述操作之前,我在 .bashrc 文件中设置了 PYTHONPATH。 问题是什么?谁能给点提示?我真的很困惑。 在非常目录中运行命令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.:我还在the repository of caffe 插入了一个问题。

【问题讨论】:

    标签: python python-2.7 ubuntu scikit-image caffe


    【解决方案1】:

    您的 Python 路径中似乎有一个名为 io 的包或模块,它掩盖了标准库包。它被导入,但没有要导入的 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

    【讨论】:

    • 嗨,@Martijn Pieters,我运行了命令,得到的错误与原始帖子有些相同。但这一次,我确定问题出在caffe目录下的io.py文件,或者skimage的_io.py文件。但是,我不知道如何解决这个问题......
    • @stoneyang:您是否将caffe/io.py 作为脚本运行?
    • @stoneyang:你在错误报告中说你设置了PYTHONPATH;你把它设置成什么?是否包括${HOME}/path/to/caffe/python/caffe
    • @stoneyang:您似乎确实在导入caffe/io.py,这表明您将该目录放在您的PYTHONPATH 中;那是错误的做法。现在查看教程。
    • 嗨,@Martijn Pieters,感谢您为我的问题所做的努力。这是原帖中的设置PYTHONPATH=${HOME}/path/to/caffe/python/caffe:$PYTHONPATH。那是错的。我已经按照您的建议尝试了新设置,但无济于事 --- 收到相同的错误。之后,我什至将目录移出caffe,即移至${HOME} 目录,并将PYTHONPATH 重定向到新的目的地。但是,仍然没有运气:(
    【解决方案2】:

    我也遇到了这个问题,按照此处 BVLC github 存储库中概述的脚本在 AWS ubuntu 14.04 实例上安装 caffe:"Caffe on EC2 Ubuntu 14.04"

    我已经按照说明设置了 python 路径。正如@Martijn Pieters 所诊断的那样,问题在于 caffe 正在导入自己的 io 库,然后导入 scikit-image 的 io 库,而后者又尝试(但失败)加载标准 python io 库(BytesIO 所在的位置)。相反,由于python路径的关系,当scikit-image尝试从模块io导入BytesIO时,它是循环回到caffe的io模块。

    我还发现,即使不尝试导入 caffe,但由于将我的 python 路径设置为包含 caffe,同样的问题也会在其他地方遇到。

    可能有几种方法可以解决这个问题。但本质是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.ioimport caffe.caffe_io

    现在,当你从 python 导入 io 时,它不会在 caffe 中提取 io 库。当你导入 caffe 时,它​​会导入其自定义的 caffe_io 库,一切都应该很好。您可能希望对 python caffe 模块进行更彻底的扫描,以确保我没有忽略导入需要更改的其他地方。

    我希望这会有所帮助。也许当我有时间时,我会发出一个拉取请求,其中包含对 caffe github 存储库的这些(或类似)更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多