我在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
答案 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
然后安装最新版本的pip
,mock
和six
,我仍然遇到了上述问题。事实证明我已经安装了两次:
/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.0
和six==1.10.0
:
cd <my_project>
virtualenv venv
source venv/bin/activate
sudo pip install -r requirements.txt
在我看来,这不仅使用起来更简单,而且可能更容易为可能想要运行代码的人提供文档。
答案 8 :(得分:0)
我发现了一件有趣的事情! 我的项目根路径中有一个名为“ functools.py”的文件,并且在我运行项目时,pycharm将引发ImportError。 所以我重命名我的文件解决了这个问题~~