Python - ImportError: cannot import name - another question - python

I've seen dozens of questions like this with different problems / solutions. After going through the first dozen or so on StackOverflow, I haven't found a solution to my problem which is:
I have a class like this:
class Flight:
pass
in a file called airtravel.py and then on my REPL (in that directory) I use:
from airtravel import Flight
which immediately fails with:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name Flight
>>>
Any suggestions?

There is no such library in Python and PyPi - https://pypi.org/search/?q=airtravel

Make sure they are both on the same directory. Your main.py And airtravel.py

There's several reasons this can happen. Since it's not a ModuleNotFoundError I can think of two things you can try:
Make sure you've spelled Flight correctly in both places. If that doesn't solve your problem then
Change the name of the module from airtravel to something else like airtravel2. The reason for this is that there's a possibility that there's another module named airtravel somewhere else, and is being imported because of higher precedence.

You can try below suggestion and see if it helps.
Probably latest content of your file airtravel.py is not Saved.
Try renaming your file airtravel.py to some other name say airtraveltest.py

Related

"import fuzzywuzzy" causes error, while "from fuzzywuzzy import fuzz" does not

When running the following code, I get an error message.
import fuzzywuzzy
print(fuzzywuzzy.fuzz.ratio('about', 'doubt'))
Error message:
Traceback (most recent call last):
File "C:/Users/vincent/Documents/PythonScripts/test2.py", line 2, in <module>
print(fuzzywuzzy.fuzz.ratio('about', 'doubt'))
AttributeError: module 'fuzzywuzzy' has no attribute 'fuzz'
Howerer, the following runs perfectly.
from fuzzywuzzy import fuzz
print(fuzz.ratio('about', 'doubt'))
Could someone help me solve this? I really appreciate it.
The answer to this depends on how your packages are laid out. I'm assuming that your directory tree looks something like this:
fuzzywuzzy/
__init__.py
fuzz.py
In that case, it's likely that fuzz is not imported in the __init__.py for fuzzywuzzy. When importing the top level of a module python only allows access to those things are imported into that module. Sub-modules require additional imports, as you've seen in your example.
If you want the first import to work then you'll need to add import fuzz to the __init__.py file for fuzzywuzzy, otherwise you'll have to use a from ... import. You could also import fuzzywuzzy.fuzz.
I would recommend not adding those imports to __init__.py, however, because it makes your code less explicit an means that new people reading the code will have to look through another file to understand from where functions are being imported.

Imported module cannot let me use the function it contains

I'm using a 2010 Head First Book for Python, chapter 2. I've created a module called nester, which contains the function print_lol, then made another program which should import nester, create a little list, and then call the function print_lol contained in nester. It doesn't work, tho.
import nester
cast = ["Palin", "Cleese", "Idle", "Jones", "Gilliam", "and Chapman."]
nester.print_lol(cast)
This is the program, and this is the output:
> Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
nester.print_lol(cast)
AttributeError: module 'nester' has no attribute 'print_lol'
What's wrong with that? Why this happens? The code is exactly as in the book, same path, environment paths are ok. What's wrong?
Here is the 'nester' code, and it works properly.
def print_lol(the_list):
for each_item in the_list:
if isinstance(each_item, list):
print_lol(each_item)
else:
print(each_item)
Also, the nester it's in C:\nester. It contains setup.py, nester.py, and the installation folders and files: MANIFEST, Lib, dist, build.
Try this on your python console
dir("nester")
It should show all the available functions. You might need to make sure print_lol is in the list. Most likely, it is under some other sub-tribute. So the way you call it should be nester.some_tribute.print_lol()
Since import nester didn't throw in error, that means your script can import nester. Try (explicit function import)
from nester import print_lol
If this fails, make sure print_lol exist in nester, as in there are no spelling mistakes.
I guess I found out the answer, and it was pretty easy, but I didn't notice that until deeper research on the website with two friends here.
The module where the 'nester' class is put it's called 'nester'. So when I tried to import 'nester', I imported the module, not the class. I changed the code from the question one to:
from nester import nester
cast = ["Palin", "Cleese", "Idle", "Jones", "Gilliam", "and Chapman."]
nester.print_lol(cast)
So I import from 'nester' Module the 'nester' Class.
Pro-tip: NEVER use the same name for Module and Class.
Credits:

Python name 'os' is not defined even though it is explicitly imported

I have a module called imtools.py that contains the following function:
import os
def get_imlist(path):
return[os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]
When I attempt to call the function get_imlist from the console using import imtools and imtools.get_imlist(path), I receive the following error:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\...\PycharmProjects\first\imtools.py", line 5, in get_imlist
NameError: name 'os' is not defined
I'm new at Python and I must be missing something simple here, but cannot figure this out. If I define the function at the console it works fine. The specific history of this module script is as follows: initially it was written without the import os statement, then after seeing the error above the import os statement was added to the script and it was re-saved. The same console session was used to run the script before and after saving.
Based on small hints, I'm going to guess that your code didn't originally have the import os line in it but you corrected this in the source and re-imported the file.
The problem is that Python caches modules. If you import more than once, each time you get back the same module - it isn't re-read. The mistake you had when you did the first import will persist.
To re-import the imtools.py file after editing, you must use reload(imtools).
Same problem is with me I am also trying to follow the book of Programming Computer Vision with Python by Jan Erik Solem" [http://programmingcomputervision.com/]. I tried to explore on internet to see the problem but I did not find any valuable solution but I have solved this problem by my own effort.
First you just need to place the 'imtools.py' into the parent folder of where your Python is installed like C:\Python so place the file into that destination and type the following command:
from PIL import Image
from numpy import *
from imtools import *
Instead of typing the code with imtools.get_imlist() you just to remove the imtools from the code like:
get_imlist()
This may solve your problem as I had found my solution by the same technique I used.

How do I install Python module given as .py file?

I do realize this is a noobish question, but I've been trying for an hour and I can't get it right.
So, I have a Python script which I'd like to modify a bit and play around with as a Python beginner. However, at the very beginning of the script, there's this:
from priodict import priority_dict
Now, I have a file named priodict.py that came with the script. But how do I make it available to the script so it can be included like that?
The Python manual has pages and pages on installing modules, but they all seem to refer to "packages" which are to be placed in certain directories etc. What do I do when I have just the .py file?
I know there is probably a banale one-sentence response to this, but I'm getting frustrated and I'm short on time so I decided to take the easy way out and ask Stack overflow about it.
It seems that, if I don't have the priodict.py file, I get this error:
Traceback (most recent call last):
File "C:\Python27\scripts\dijksta.py", line 192, in <module>
main()
File "C:\Python27\scripts\dijksta.py", line 185, in main
D, _ = dijkstra(G, 1, v)
File "C:\Python27\scripts\dijksta.py", line 139, in dijkstra
Q = priority_dict() # est.dist. of non-final vert.
NameError: global name 'priority_dict' is not defined
If I place the file in the same directory as my script, I get this error:
Traceback (most recent call last):
File "C:\Python27\scripts\dijksta.py", line 2, in <module>
from priodict import priority_dict
ImportError: cannot import name priority_dict
These are the files in question:
https://github.com/kqdtran/ADA1/tree/master/dijkstra
Place the file in the same directory, and that will get you started. Seems you've figured out that much. If all you have is a .py file, that's what you're usually expected to do.
If you're unable to import a name from a module, it usually means that name doesn't exist in that module. Try:
import priodict
print dir(priodict)
Is priority_dict listed? If not, is there a similarly named attribute that might be what you're looking for? It may just be that the instructions given you were misspelled, like the _ wasn't needed.
If it fails on the import line, it may be that there's an error in the module code itself that must be corrected first. you'll get an error telling you roughly where it is.

Python wont define function

I am getting back into python and I'm having a really basic issue....
My source has the following...
def calrounds(rounds):
print rounds
When I run this through the shell and try to call calrounds(3) I get..
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
calrounds(3)
NameError: name 'calrounds' is not defined
Its been awhile since I've used python, humor me.
Did you import your source first?
It says that the first line of your program is calling calrounds with a parameter 3. Move that below your function definition. The definition needs to be before you call the function. If you are using python 3.0+ you need parenthesis for the print statement.
>>> def calrounds(rounds):
print(rounds)
>>> calrounds(3)
3
The first thing to do is to look at how you're calling the function. Assuming it's in myModule.py, did you import myModule or did you from myModule import calrounds? If you used the first one, you need to call it as myModule.calrounds().
Next thing I would do is to make sure that you're restarting your interpreter. If you have imported a module, importing it again will not reload the source, but use what is already in memory.
The next posibility is that you're importing a file other than the one you think you are. You might be in a different directory or loading something from the standard library. After you import myModule you should print myModule.__file__ and see if it is the file you think you're working on. After 20 years of programming, I still find myself doing this about once a year and it's incredibly frustrating.
Finally, there's the chance that Python is just acting up. Next to your myModule.py there will be a myModule.pyc - this is where Python puts the compiled code so it can load modules faster. Normally it's smart enough to tell if your source has been modified but, occassionally, it fails. Delete your .pyc file and restart the interpreter.

Categories