ImportError:无法导入名称换行

时间:2015-07-14 21:46:56

标签: 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

模拟== 1.1.3 6 == 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

也尝试用sudo没有运气。

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

9 个答案:

答案 0 :(得分:31)

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

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

检查所有内容的版本

pip freeze | grep -e six -e mock
easy_install --version

更新所有内容

wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python
pip install mock --upgrade
pip install six --upgrade

谢谢@lifeless

答案 1 :(得分:19)

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

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/

/Library/Python/2.7/site-packages/

前者比后者早。

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

import six
six.__version__

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

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

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

运行
find /System/Library/Frameworks/Python.framework/Versions -name six.py*

答案 2 :(得分: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)有一个声称是1.9.0的发行版六包,由于某种原因没有包装 3)使用的setuptools没有与pbr正确集成,缺少deps 4)你的pip / setuptools组合没有正确地查询滚轮元数据。

我们确实需要setuptools 17.1,而且最近才由setup.py明确报告。我很喜欢它,如果你能想出这些是哪种情况并更新https://github.com/testing-cabal/mock/issues/298,以便我们可以解决任何导致setup.py / wheels静默失败的交互。

答案 3 :(得分:3)

在Mac OSX上,之前安装的六个版本阻止了我的升级版本的使用。我通过在我的翻译中运行以下内容来验证这一点:

import six
six.__version__

为了解决这个问题,我移动了文件:

mv/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py 
/tmp/old_six.py

这已在本网站的另一个答案中说明,但我想提供更简化的回复。

答案 4 :(得分:2)

我最初的问题与旧的&#34; OS拥有的&#34;版本和pip / setuptools。手动安装pip之后,就像这样:

wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo ln -s /usr/local/bin/pip /usr/bin/pip

然后安装最新版本的pipmocksix,我仍然遇到了上述问题。事实证明我已经安装了两次:

/usr/lib/python2.7/dist-packages/

并在

/usr/local/lib/python2.7/dist-packages/

从/ usr / lib /中删除了六个后,它运行正常: rm /usr/lib/python2.7/dist-packages/*six*

答案 5 :(得分:1)

我做了6个== 1.9.0的pip安装,它采用了新版本。似乎mock == 1.3.0没有正确定义它需要获得包装支持的六个版本。

答案 6 :(得分:1)

另一种解决方案是将PYTHONPATH环境变量设置为指向已安装的软件包。

在我的bash配置中设置我的环境变量,以便:

PYTHONPATH=/Library/Python/2.7/site-packages

允许我在终端中运行测试(不删除/重命名任何库等)。

然而,当使用PyCharm时,没有正确地导入此环境变量是不太有用的。尽管PyCharm显示为包含父变量(在其显示的导入中列出的变量),但似乎此导入无法正常工作。

在PyCharm运行配置中手动将环境变量设置为上述内容可解决此问题。

我不确定PyCharm是否在从系统环境变量或其他一些技巧中导入之后覆盖PYTHONPATH变量,但这确实解决了我的错误。

答案 7 :(得分:0)

虽然您没有使用像virtualenv这样的虚拟环境,但它确实是一个很好的用例。通过沙箱化您的Python安装和项目的所有依赖项,您可以完全避免破坏全局/默认的python安装,这是很多复杂性/难度的来源。

这是我在收到wraps错误时使用的内容 - requirements.txt包含mock==2.0.0six==1.10.0

cd <my_project>
virtualenv venv
source venv/bin/activate
sudo pip install -r requirements.txt

在我看来,这不仅使用起来更简单,而且可能更容易为可能想要运行代码的人提供文档。

答案 8 :(得分:0)

我发现了一件有趣的事情! 我的项目根路径中有一个名为“ functools.py”的文件,并且在我运行项目时,pycharm将引发ImportError。 所以我重命名我的文件解决了这个问题~~