【问题标题】:ImportError: cannot import name wraps on MacImportError:无法在 Mac 上导入名称换行
【发布时间】:2016-03-17 23:05:31
【问题描述】:

我正在尝试在 IDE 上使用 mock 运行 Python 单元测试:PyCharm。

由于我使用的是 Mac (El Capiton),我无法做到:
pip install mock

所以我做了:
sudo -H pip install --ignore-installed six
sudo -H pip install --ignore-installed mock

安装成功。现在,当我编写测试时,它会引发以下错误:

File "/Library/Python/2.7/site-packages/mock/__init__.py", line 2, in <module>
import mock.mock as _mock
  File "/Library/Python/2.7/site-packages/mock/mock.py", line 68, in <module>
from six import wraps
ImportError: cannot import name wraps

我该如何解决这个问题?

【问题讨论】:

  • 未安装 mock 1.3.0 并安装 mock 1.0.1。由于后者不依赖于六个,所以问题解决了!

标签: python unit-testing mocking pycharm


【解决方案1】:

模拟需要six version 1.7 or newerpip show six 获取版本,pip install --upgrade six 升级。

如果这不起作用,请检查正在加载哪个版本的 six

  • 检查 Python 版本

    thomas:~$ python -c 'import six; print(six.__version__)'
    1.10.0
    
  • 使用pip show six检查pip版本

    thomas:~$ pip show six | grep ^Version
    Version: 1.10.0
    
  • 检查 Python 位置

    thomas:~$ python -c 'import six; print(six.__file__)'
    /Library/Python/2.7/site-packages/six.pyc
    

删除python版本和pip版本不同,从Python Location

中删除six.pysix.pyc

来源:

Stackoverflow

Github

Github

【讨论】:

  • 我在终端上运行了以下操作:find /System/Library/Frameworks/Python.framework/Versions -name six.py* 并找到:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/lib/six.py /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy/lib/six.pyc /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.pyc。应该删除哪一个?
  • six 肯定有旧版本。检查pip show six 并查看 pip 安装它的位置。你的python path 是什么?使用python -c "import six; print six.__file__"查看python正在加载的版本。
  • pip show six 显示Location: /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
  • python -c "import sys; print sys.path 正在返回:['', '/Library/Python/2.7/site-packages/Django-1.9.2-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', ... 等等
  • 实际加载的是什么? python -c "import six; print six.__file__"。如果与pip show six 相同,那么pip show six 的版本是什么。六个版本 1.10.0 正在为我工​​作。 pip install --upgrade six 升级。
【解决方案2】:

问题是在/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/pythonsys.path 中有一个旧版本的六(1.4.1),这个目录在/Library/Python/2.7/site-packages 之前安装了新版本的六。这在我看来像是 Apple 提供的 python 的配置问题。

我能想到的最简单的解决方案是将PYTHONPATH 环境变量显式设置为包含/Library/Python/2.7/site-packages,因此它在/System/... 路径之前的sys.path 中结束:

export PYTHONPATH="/Library/Python/2.7/site-packages:$PYTHONPATH"

我想在 /usr/local 中安装正确配置的 python 也可以解决问题。

【讨论】:

    猜你喜欢
    • 2015-10-03
    • 2013-09-14
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2019-04-23
    • 2021-06-28
    相关资源
    最近更新 更多