我在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
安装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
我在我的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*
所以模拟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的这种无声失败的任何交互。
在Mac OSX上,之前安装的六个版本阻止了我升级版本的使用。我通过在我的解释器中运行以下内容来验证这一点:
import six
six.__version__
为了解决这个问题,我移动了文件:
mv/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six.py
/tmp/old_six.py
这已在本网站的另一个答案中说明,但我想提供更简化的回复。
我最初遇到了旧的“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
然后安装最新版本的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*
我做了6个== 1.9.0的pip安装,它采用了新版本。似乎mock == 1.3.0没有正确定义它需要获得包装支持的六个版本。
另一种解决方案是将PYTHONPATH环境变量设置为指向已安装的包。
在我的bash配置中设置我的环境变量,以便:
PYTHONPATH=/Library/Python/2.7/site-packages
允许我在终端中运行测试(不删除/重命名任何库等)。
但是,在使用PyCharm时,无法正确导入此环境变量。尽管PyCharm显示为包含父变量(在其显示的导入中列出的变量),但似乎此导入无法正常工作。
在PyCharm运行配置中手动将环境变量设置为上述内容可解决此问题。
我不确定PyCharm是否在从系统环境变量或其他一些技巧中导入之后覆盖了PYTHONPATH变量,但这确实解决了我的错误。
虽然你没有使用像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
在我看来,这不仅使用起来更简单,而且对于可能想要运行代码的人来说也更简单。
我找到了一些有趣的东西!在我的项目根路径中有一个名为“functools.py”的文件,当我运行我的项目时,pycharm将引发ImportError。所以我重命名我的文件修复这个问题~~