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()
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With