ImportError:无法导入名称换行

问题描述 投票:24回答:9

我在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

也试过sudo没有运气。

$ sudo python -c 'from six import wraps'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: cannot import name wraps
python mocking python-unittest
9个回答
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

更新一切

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

谢谢@lifeless


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的框架默认带有六个版本。)

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

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

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

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
投票

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

import six
six.__version__

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

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

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


2
投票

我最初遇到了旧的“OS拥有”版本和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*


1
投票

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


1
投票

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

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

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

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

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

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

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


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

在我看来,这不仅使用起来更简单,而且对于可能想要运行代码的人来说也更简单。


0
投票

我找到了一些有趣的东西!在我的项目根路径中有一个名为“functools.py”的文件,当我运行我的项目时,pycharm将引发ImportError。所以我重命名我的文件修复这个问题~~

© www.soinside.com 2019 - 2024. All rights reserved.