Search code examples
jsonmatplotlibsimplejson

simplejson json AttributeError: "module" object has no attribute "dump"


I am new at programming and I have a question regarding the following error. I am using python 2.7., and I have the following script to create a simple graph (example taken from python CrashCourse by Eric Matthes):

    import matplotlib.pyplot as plt


    squares = [1,4,9,16,25]
    plt.plot(squares, linewitdth = 5)

    #Set chart title and lable axes.
    plt.title("Square Numbers", fontsize = 24)
    plt.xlabel("Value", fontsize = 14)
    plt.ylabel("Square of Value", fontsize = 14)

    # Set size of tick labels
    plt.tick_params(axis = "both", labelsize = 14)

    plt.show()

When I ran this script in WindowsPowerShell I got the following error:

Traceback (most recent call last): File "mpl_squares.py", line 1, in <module> 
import matplotlib.pyplot as plt
File "C:\Users\Roger\Anaconda2\lib\sitepackages\matplotlib\__init__.py, line 134, in <module> from ._version import get_versions
File "C:\Users\Roger\Anaconda2\lib\site-packages\matplotlib\_version.py", line 7, in <module> import json
File "C:\Users\Roger\Desktop\lpthw\json.py", line 7, in <module>
AttributeError: "module" object has no attribute "dump"

In other script I had the same problem when importing this module, then I found a solution by replacing the line "import json" by "import simplejson, and It worked well.

Here is the solution I found back then:

json is simplejson, added to the stdlib. But since json was added in 2.6, simplejson has the advantage of working on more Python versions (2.4+).

simplejson is also updated more frequently than Python, so if you need (or want) the latest version, it's best to use simplejson itself, if possible.

A good practice, in my opinion, is to use one or the other as a fallback.

try: import simplejson as json except ImportError: import json

Now I checkt in the error I got the module it is poiting out "_version.py" This is the information contained in this file:

   # This file was generated by 'versioneer.py' (0.15) from
   # revision-control system data, or from the parent directory name of an
   # unpacked source archive. Distribution tarballs contain a pre-generated 
   #copy
   # of this file.

   import json
   import sys

   version_json = '''
    {
     "dirty": false,
     "error": null,
     "full-revisionid": "26382a72ea234ee0efd40543c8ae4a30cffc4f0d",
     "version": "1.5.3"
    }
    '''  # END VERSION_JSON


   def get_versions():
        return json.loads(version_json)

Question: Do you think I would have to fix something in the _version.py module by replacing import json for import simplejson and the function added in the module?

I am thinking in a workaround to fix the problem but I don't wanna modify anything from the _version.py if it make things worse. Thank you very much for your comments and suggestions.

Best Regards


Solution

  • It seems like your C:\Users\Roger\Desktop\lpthw\json.py gets imported instead of Python's built-in json module.

    Did you somehow add that folder (C:\Users\Roger\Desktop\lpthw) to your PYTHONPATH, e.g. with sys.path.append() or the PYTHONPATH variable? Read more about how Python finds modules.

    The reason why the fix with simplejson works is that it is not overridden by some other module of the same name.

    Try renaming C:\Users\Roger\Desktop\lpthw\json.py to something like C:\Users\Roger\Desktop\lpthw\myjson.py and also try to figure out how that lpthw folder made it into your PYTHONPATH.