Reputation: 3058
I've been wrestling most of the night trying to solve an import error.
This is a common issue, but no previous question quite answers my issue.
I am using PyDev (an Eclipse plugin), and the library Kivy (a Python library)
I have a file structure set up like this:
<code>
__init__.py
main.py
engine.py
main_menu_widget.py
"code" is held within the eclipse folder "MyProject" but it's not a package so I didn't include it.
The files look like this:
main.py
# main.py
from code.engine import Engine
class MotionApp(App):
# Ommited
engine.py
# engine.py
from code.main_menu_widget import MainMenuWidget
class Engine():
# Ommited
main_menu_widget.py
# main_menu_widget.py
from code.engine import Engine
class MainMenuWidget(Screen):
pass
The error I recieve, in full detail, is:
Traceback (most recent call last):
File "C:\MyProject\code\main.py", line 8, in <module>
from code.engine import Engine
File "C:\MyProject\code\engine.py", line 6, in <module>
from code.main_menu_widget import MainMenuWidget
File "C:\MyProject\code\main_menu_widget.py", line 3, in <module>
from code.engine import Engine
Any idea what I did wrong here? I just renamed my entire folder structure because I screwed up this module structure so bad, but I think i'm close to how it should look....
Upvotes: 10
Views: 52223
Reputation: 1091
There seems to be a circular import.
from engine.py
you are importing main_menu_widget
while from main_menu_widget
you are importing engine
.
That is clearly a circular import which is not allowed by python.
Upvotes: 13
Reputation: 18228
Your code directory is a package. Ensure that the directory above it, i.e C:\MyProject
judging from your error messages, is in your PYTHONPATH.
Open the context menu by selecting your project and clicking your mouse's right button, then select Properties. Select PyDev - PYTHONPATH and from there the Source folders tab. Check that the directory mentioned above is present; if it isn't press Add source folder, select it from the dialogue and press OK.
Upvotes: 1
Reputation: 4006
it's in the same folder, use a relative package name (it's a good practice to do so anyway):
from .engine import Engine
Upvotes: 5