AttributeError: 'NoneType' object has no attribute 'loader'

Solution 1:

Delete /home/cjones/.local/lib/python3.6/site-packages/googleapis_common_protos-1.5.8-py3.6-nspkg.pth and retry.

Solution 2:

I had the similar problem, but the error message referenced a different .pth file. The error message I received was:

Error processing line 1 of /Users/jt/anaconda3/lib/python3.7/site-packages/sphinxcontrib.datatemplates-nspkg.pth:

  Traceback (most recent call last):
    File "/Users/jt/anaconda3/lib/python3.7/site.py", line 168, in addpackage
      exec(line)
    File "<string>", line 1, in <module>
    File "<frozen importlib._bootstrap>", line 580, in module_from_spec
  AttributeError: 'NoneType' object has no attribute 'loader'

Remainder of file ignored

Following the solution described here:

https://github.com/Pyomo/pyomo/issues/95

I edited the .pth file (the file at the start of the error message, immediately after the text Error processing line 1 of) and added a newline character after the first semicolon. That is, I changed:

import sys, types, os;has_mfs = sys.version_info > (3, 5);p ...<rest of file>

To:

import sys, types, os;
has_mfs = sys.version_info > (3, 5);p ...<rest of file>

I don't know why this worked, but it did.

Solution 3:

I had a similar error with my virtual environments on a mac, but referring to matplotlib:

Error processing line 1 of //anaconda3/lib/python3.7/site-packages/matplotlib-3.1.3-py3.7-nspkg.pth:

As in the previous answer, it was solved by changing the file mentioned:

import sys, types, os;has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).$

to this, via a linebreak:

import sys, types, os;
has_mfs = sys.version_info > (3, 5);p = os.path.join(sys._getframe(1).$

Solution 4:

I had to do :0,$s/;/;\r/g in vi.

it looks like a line is too long for pip3 to process. Basically, some packages put all commands on one line and that overflows a buffer somewhere.

This vi command puts a carriage return after every semicolon. (It is possible a newline (\n) would work instead of a carriage return.)

Breakdown of the command:

: - use ED line editor command
0,$ - run on all lines
s - regular expression substitution
/ - delimiter start search
; - replace semicolon with
/ - delimiter end search start replace
;\r - replace with semicolon followed by carriage return
/ - delimiter end replace
g - global - do more than once per line.

This is a very common vi command. If you need to replace a "/", you can use another character as the delimiter - the first character after "s" is the delimiter