ImportError: cannot import name wraps

无人久伴 提交于 2019-12-20 16:48:13

问题


I'm using python 2.7.6 on Ubuntu 14.04.2 LTS. I'm using mock to mock some unittests and noticing when I import mock it fails importing wraps.

Not sure if there's a different version of mock or six I should be using for it's import to work? Couldn't find any relevant answers and I'm not using virtual environments.

mock module says it's compatible with 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

also tried with sudo with no luck.

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

回答1:


Installed mock==1.0.1 and that worked for some reason. (shrugs)

edit: The real fix for me was to updated setuptools to the latest and it allowed me to upgrade mock and six to the latest. I was on setuptools 3.3. In my case I also had to remove said modules by hand because they were owned by OS in '/usr/local/lib/python2.7/dist-packages/'

check versions of everything

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

Update everything

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

Thanks @lifeless




回答2:


I encountered the same issue on my mac, which I was able to fix by realizing that my python's sys.path contained both

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

and

/Library/Python/2.7/site-packages/

with the former earlier than the latter.

You can test if this is happening to you by running the following in the python console.

import six
six.__version__

my python was loading an outdated six.py from the former directory (which didn't have wrapper), even though pip had installed a newer version six in the second directory. (It seems mac's framework comes with a version of six by default.)

I was able to fix it by moving six.py and six.pyc out of the first directory (requires sudo access), so that python would find the newer version of six in the second directory. I'm sure you could also change the ordering of the paths in sys.path.

To find the older version of six that need to be deleted run this from the terminal console

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



回答3:


so mock 1.1.1 and above defines a versioned requirement on six 1.7 or above:

https://github.com/testing-cabal/mock/blob/master/requirements.txt#L6

This gets reflected into setuptools metadata by pbr, which there is a versioned setup_requires dependency on:

https://github.com/testing-cabal/mock/blob/master/setup.py#L17

So there are a couple of possibilities: 1) six 1.7 is not new enough 2) there's a distro six package claiming to be 1.9.0 that doesn't have wraps for some reason 3) the setuptools in use didn't integrate properly with pbr and deps are missing 4) the wheel metadata isn't being interrogated properly by your pip/setuptools combination.

We do have a hard requirement for setuptools 17.1, and that was only explicitly reported by setup.py more recently. I'd love it if you can figure which of these is the case and update https://github.com/testing-cabal/mock/issues/298 so that we can fix whatever interaction is leading to this silent failure of setup.py / wheels.




回答4:


On Mac OSX, the previously installed version of six was blocking my upgraded version from being used. I verified this, as previously suggested by running the following in my interpreter:

import six
six.__version__

To fix this I moved the file:

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

This is stated already in another answer on this site, but I wanted to provide a more streamlined response.




回答5:


I originally had an issue with old "OS-owned" versions of and pip/setuptools. After I installed pip manually, like so:

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

And then installing the latest version of pip, mock and six, I still had the problem you've described above. Turns out that I had six installed twice in:

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

and in

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

After I removed the six from /usr/lib/ it worked fine: rm /usr/lib/python2.7/dist-packages/*six*




回答6:


I did a pip install of six==1.9.0 and it took the new version. It seems like mock==1.3.0 doesn't properly define the version of six that it needs to get wraps support.




回答7:


Another solution is setting your PYTHONPATH environment variable to point to the installed packages.

Setting my environment variable in my bash config so that:

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

Allowed me to run tests in terminal (without removing/renaming any libraries, etc).

However, when using PyCharm, it was less-than-helpfully not correctly importing this environment variable. Even though PyCharm was showing as including parent variables (with that listed in the ones it showed importing), it seems this import wasn't working correctly.

Manually setting the environment variable to the above in the PyCharm run configuration resolves this.

I am unsure if PyCharm overwrites the PYTHONPATH variable after importing it from system environment variables or some other trickery, but this did resolve the error for me.




回答8:


Though you aren't using a virtual environment like virtualenv, it's certainly a great use case for it. By sandboxing your Python installation and all the dependencies for your project, you can avoid hacking away at the global/default python installation entirely, which is where a lot of the complexity/difficulty comes from.

This is what I used when I got the wraps error - requirements.txt contains mock==2.0.0 and six==1.10.0:

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

Not only is this simpler to use in my opinion, it's also simpler to document for people who might want to run your code.




回答9:


I found a interesting things! There is a file named "functools.py" in my project root path, and while I run my project , pycharm will raise ImportError. So I rename my file fix this problem~~



来源:https://stackoverflow.com/questions/31417964/importerror-cannot-import-name-wraps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!