ImportError:无法导入名称换行

Mic*_*ael 24 python mocking python-unittest

我在Ubuntu 14.04.2 LTS上使用python 2.7.6.我正在使用mock来模拟一些单元测试并注意到当我导入mock时它无法导入换行.

不确定是否有一个不同版本的模拟或六个我应该使用它的导入工作?找不到任何相关答案,我没有使用虚拟环境.

mock模块说它与python 2.7.x兼容:https://pypi.python.org/pypi/mock

mock == 1.1.3 six == 1.9.0

Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mock import Mock
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/mock/__init__.py", line 2, in <module>
    import mock.mock as _mock
  File "/usr/local/lib/python2.7/dist-packages/mock/mock.py", line 68, in <module>
    from six import wraps
ImportError: cannot import name wraps
Run Code Online (Sandbox Code Playgroud)

也试过sudo没有运气.

$ sudo python -c 'from six import wraps'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: cannot import name wraps
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 31

安装mock == 1.0.1并且由于某种原因而起作用.(耸耸肩)

编辑:我真正的解决方案是将setuptools更新到最新版本,它允许我升级模拟和六个到最新.我在setuptools 3.3上.在我的情况下,我还必须手动删除所述模块,因为它们归'/usr/local/lib/python2.7/dist-packages/'中的操作系统所有.

检查一切的版本

pip freeze | grep -e six -e mock
easy_install --version
Run Code Online (Sandbox Code Playgroud)

更新一切

wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
pip install mock --upgrade
pip install six --upgrade
Run Code Online (Sandbox Code Playgroud)

谢谢@lifeless

  • 多数民众赞成因为模拟1.0.1并不依赖于六. (2认同)
  • 嗯现在我的Mac上也有同样的问题,即使是最后一个版本,所以我不确定这意味着什么.setuptools == 18.0.1,mock == 1.3.0,6 six == 1.9.0 (2认同)
  • 谢谢,`pip install mock == 1.0.1`可以帮助您。 (2认同)
  • 我已经回到这么多次了.如果我可以多次投票,我会.谢谢你的回答. (2认同)

小智 19

我在我的mac上遇到了同样的问题,我能够通过意识到我的python的sys.path包含两者来解决这个问题

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
Run Code Online (Sandbox Code Playgroud)

/Library/Python/2.7/site-packages/
Run Code Online (Sandbox Code Playgroud)

与前者比后者早.

您可以通过在python控制台中运行以下命令来测试是否发生了这种情况.

import six
six.__version__
Run Code Online (Sandbox Code Playgroud)

我的python正在从前一个目录(没有包装器)加载一个过时的six.py,即使pip在第二个目录中安装了较新的版本6.(看来mac的框架默认带有六个版本.)

我能够通过将six.py和six.pyc移出第一个目录(需要sudo访问)来修复它,这样python就会在第二个目录中找到更新版本的六个.我相信你也可以改变sys.path中路径的顺序.

要查找需要删除的旧版本的六个版本,请从终端控制台运行此版本

find /System/Library/Frameworks/Python.framework/Versions -name six.py*
Run Code Online (Sandbox Code Playgroud)


lif*_*ess 5

因此模拟1.1.1及更高版本在六个1.7或更高版本上定义了版本要求:

https://github.com/testing-cabal/mock/blob/master/requirements.txt#L6

pbr将其反映到setuptools元数据中,该版本具有setup_requires依赖的版本:

https://github.com/testing-cabal/mock/blob/master/setup.py#L17

因此,有两种可能:1)六个1.7还不够新2)有一个发行版6软件包声称是1.9.0,由于某些原因没有包装3)使用中的setuptools无法正确集成缺少pbr和deps 4)您的pip / setuptools组合未正确询问转盘元数据。

我们对setuptools 17.1确实有严格的要求,而setup.py仅在最近才明确报告。如果您能找出其中的一种情况并更新https://github.com/testing-cabal/mock/issues/298,我将非常乐意,以便我们可以解决导致此安装失败的任何交互。 py /车轮。