Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mtaplotlib AttributeError: 'module' object has no attribute 'pyplot'

Before anyone says "duplicate question" or anything, please read on, it's not the same as other questions.

So when i run my small program;

python numbers.py

where

$ file `which python`
/usr/bin/python: symbolic link to 'python2.7'

$ file `which python2.7`
/usr/bin/python2.7: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x623b662458af705775fcbd2576ca06eaa82bc482, stripped

and i'm using matplotlib version 1.2;

/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/

I have tried several approaches to get it to work;

from matplotlib import pyplot as plt
import matplotlib.pyplot as plt

neither of them work. they both give the same error;

$ python numbers.py
Traceback (most recent call last):
  File "numbers.py", line 1, in <module>
    import matplotlib.pyplot as plt
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/pyplot.py", line 26, in <module>
    from matplotlib.figure import Figure, figaspect
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/figure.py", line 34, in <module>
    import matplotlib.colorbar as cbar
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/colorbar.py", line 29, in <module>
    import matplotlib.collections as collections
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/collections.py", line 23, in <module>
    import matplotlib.backend_bases as backend_bases
  File "/usr/local/lib/python2.7/dist-packages/matplotlib-1.2.0-py2.7-linux-x86_64.egg/matplotlib/backend_bases.py", line 51, in <module>
    from PIL import Image
  File "/usr/local/lib/python2.7/dist-packages/PIL/Image.py", line 90, in <module>
    import numbers
  File "/home/will/Documents/python/numbers/numbers.py", line 1, in <module>
    import matplotlib.pyplot as plt
AttributeError: 'module' object has no attribute 'pyplot'

What is really frustrating, is that i have another file, with from matplotlib import pyplot as plt at the top, and it works fine. I can't see any reason why one would work and the other wouldn't...

I tried changing the file name too, so that it wasn't numbers.py but that didnt' work either.

Has anyone come across this before and fixed it? Or know why it doesn't work?

Here's the full file:

from matplotlib import pyplot as plt


def toString(number):
    if type(number) == float:
        return floatToString(number)
    elif type(number) == int:
        return intToString(number)
    elif type(number) == complex:
        return complexToString(number)
    else:
        return "NaN"


def intToString(number):
    if number < 0:
        return "minus " + intToStringPos(abs(number))
    else:
        return intToStringPos(number)

def intToStringPos(number):
    upTo20 = [""] + "one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen".split()
    tenTimes = "twenty thirty fourty fifty sixty seventy eighty ninety hundred".split()
    logs = [""] + "thousand million billion trillion quadrillion".split()

    if len(str(number)) > 3:
        #split number into groups of three, from the right hand end    
        number = list(reversed(str(number)))

        groups = list(reversed([int("".join(reversed([number[i+j] for j in range(3) if i+j < len(number)]))) for i in range(0, len(number), 3)]))

        retString = ""
        for i, number in enumerate(reversed(groups)):
            if number == 0:
                continue
            elif i == 0 and len(str(number)) < 3:
                if number != 0:
                    retString = "and " + intToString(number)
            else:
                retString = intToString(number) + " " + logs[i] + " " + retString

        return retString.strip()

    elif 1000 > number > 99:
        tens = intToString(int(str(number)[1:]))
        if tens != "zero":
            return upTo20[number/100] + " hundred and " + tens
        else:
            return upTo20[number/100]

    elif 100 > number >= 20:
        return tenTimes[number/10-2] + " " + upTo20[number - 10*(number/10)]

    elif 0 < number < 20:
        return upTo20[number]

    elif number == 0:
        return "zero"

def floatToString(number):
    integerPart, decimalPart = divmod(number,1)
    retString = intToString(int(integerPart))
    if decimalPart > 0.0:
         return retString + " point " + " ".join([intToString(int(d)) for d in str(decimalPart)[2:]])
    else:
         return retString

def complexToString(number):
    retString = []
    if number.real > 0.0:
        retString.append(floatToString(number.real))
    if number.imag > 0.0:
        if number.imag == 1:
            retString.append("j")
        else:
            retString.append(floatToString(number.imag) + " j")

    return " plus ".join(retString)


lengths = []
for number in range(1000):
    print toString(number)      
    lengths.append(len(toString(number)))

print lengths

plt.plot(range(1000), lengths)
plt.pyplot.show()
like image 211
will Avatar asked Dec 03 '13 16:12

will


1 Answers

You are shadowing a system file and getting a circular import.

Note that the first and last file of your trace back are trying it import from the same file.

Change the name of your file to something else (and remove the pyc file) and it should work.

Also see matplotlib not working anymore due to interactive issue which had a similar problem.

like image 113
tacaswell Avatar answered Nov 10 '22 12:11

tacaswell