7

OS: Mac OS X. When I'm trying to run the code below, I get the error:

ImportError: cannot import name HeaderParsingError

I've attached traceback below the code.

I've tried to solve this issue for 20 min now, using Google and other stackoverflow. I have tried running:

pip install urllib3 --upgrade

I've also tried reinstalling the requests package.

It did not help.

This seems to be an issue with my requests or urllib3 package. Has anyone had a similar issue?

The code:

import requests
import json


def printResponse(r):
print '{} {}\n'.format(json.dumps(r.json(), sort_keys=True, indent=4,    separators=(',', ': ')), r)


r = requests.get('http://wikitest.orcsoftware.com/rest/api/content',
             params={'title': 'new page'},
             auth=('seb', '****'))
printResponse(r)
parentPage = r.json()['results'][0]
pageData = {'type': 'comment', 'container': parentPage,
        'body': {'storage': {'value': "<p>A new comment</p>", 'representation': 'storage'}}}
r =    requests.post('http://localhost:8080/confluence/rest/api/content',
              data=json.dumps(pageData),
              auth=('admin', 'admin'),
              headers=({'Content-Type': 'application/json'}))
printResponse(r)

This is the traceback:

Traceback (most recent call last):
  File "/Users/sebastian/OneDrive/orc/restAPI/createSpace.py", line 1, in <module>
    import requests
  File "/Library/Python/2.7/site-packages/requests/__init__.py", line 61, in <module>
    from . import utils
  File "/Library/Python/2.7/site-packages/requests/utils.py", line 25, in <module>
    from .compat import parse_http_list as _parse_list_header
  File "/Library/Python/2.7/site-packages/requests/compat.py", ine 7, in <module>
    from .packages import charade as chardet
  File "/Library/Python/2.7/site-packages/requests/packages/__init__.py", line 3, in <module>
    from . import urllib3
  File "/Library/Python/2.7/site-packages/requests/packages/urllib3/__init__.py", line 16, in <module>
    from .connectionpool import (
  File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connectionpool.py", line 33, in <module>
    from .connection import (
  File "/Library/Python/2.7/site-packages/requests/packages/urllib3/connection.py", line 41, in <module>
    from .util import (
  File "/Library/Python/2.7/site-packages/requests/packages/urllib3/util/__init__.py", line 4, in <module>
    from .response import is_fp_closed
  File "/Library/Python/2.7/site-packages/requests/packages/urllib3/util/response.py", line 3, in <module>
    from ..exceptions import HeaderParsingError
ImportError: cannot import name HeaderParsingError
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
seb
  • 2,251
  • 9
  • 30
  • 44
  • please format your code. – salmanwahed Oct 07 '15 at 08:00
  • @salmanwahed, not sure what you mean. I included the code in the recommended way. Is something wrong with the tabs? It works with my IDE (pyCharm). – seb Oct 07 '15 at 09:08
  • yes indentation problem in the code. – salmanwahed Oct 07 '15 at 09:10
  • Not sure how you got in this state, but you'll need to reinstall `requests` itself; it *includes* a version of `urllib3` in the `requests/packages` directory. It is `requests/packages/urllib3/exceptions.py` that is the cause of this issue here. – Martijn Pieters Oct 07 '15 at 09:20
  • 1
    @MartijnPieters, thanks, will try. – seb Oct 07 '15 at 09:23
  • @MartijnPieters, that solved the issue! If you post it as an answer, I'll accept it. I had to uninstall requests before re-installing it in order to make this work. – seb Oct 07 '15 at 09:29
  • It seems that even after more than one year we keep seeing this error, time to log it as bug https://github.com/kennethreitz/requests/issues/3670 – sorin Nov 10 '16 at 18:41

3 Answers3

22

requests comes with its own copy of the urllib3 library, in the requests/packages subdirectory. It is this copy that is somehow broken.

Reinstall requests itself; either upgrade (you have at most version 2.1.0, given the from .packages import charade as chardet line), or reinstall the existing version.

Reinstalling with pip can be done with the --force-reinstall switch:

pip install --force-reinstall requests==2.1.0

or force an upgrade:

pip install --upgrade requests
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
  • 2
    For me it was not the requests urllib3 but the actual one, so a `[sudo] pip uninstall urllib3` and `[sudo] pip install urllib3` did the trick. – radtek Mar 21 '16 at 21:42
  • Got the same problem on RHEL, and a forced reinstalled worked. This means that it does happen often for requests librate to become broken. – sorin Nov 10 '16 at 18:31
  • I added https://github.com/kennethreitz/requests/issues/3670 as the errors seems to reoccur. – sorin Nov 10 '16 at 18:42
2

I had the same issue while I was simply trying to make any command using pip. At the end I found a very simple solution, just use sudo before pip.

Specifically for above issue, I have used following command.

sudo pip install --upgrade urllib3

Hope that will help.

user1012513
  • 2,089
  • 17
  • 14
1

It could be an issue with the "urllib3" package itself. uninstall/install will fix the problem.

sudo pip uninstall urllib3
sudo pip install --upgrade urllib3

In my case, the error was:

ImportError: cannot import name UnrewindableBodyError

Another issue could be that, urllib3 was installed via pip, and requests installed via yum repo, or vice-versa. In that case, the fix is to completely remove these libraries and install it via same repo.

I recommend pip over yum to install both packages as it is easy to maintain and gives more control. Any further yum updates required for OS patching or VM maintenance activities etc., won't impact the packages installed via pip.

First remove all installations of “urllib3” and “requests” via pip and yum:

sudo pip uninstall urllib3 -y
sudo pip uninstall requests -y
sudo yum remove python-urllib3 -y
sudo yum remove python-requests -y

To have single source of installations, use either of the below steps, not both.

Now install both packages only via pip:

sudo pip install --upgrade urllib3
sudo pip install --upgrade requests

Or, use only yum. I prefer pip over yum as explained above.

To install both packages only via yum:

sudo yum install python-urllib3
sudo yum install python-requests

Note: Always use virtual environment to avoid conflicts when an yum update happens at OS level.

Lalit Kumar B
  • 47,486
  • 13
  • 97
  • 124