10

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....

1

3 Answers 3

13

There seems to be a circular import. from engine.py you are importing main_menu_widget while from main_menu_widgetyou are importing engine.

That is clearly a circular import which is not allowed by python.

Sign up to request clarification or add additional context in comments.

Comments

5

it's in the same folder, use a relative package name (it's a good practice to do so anyway):

from .engine import Engine

6 Comments

not code.engine? Wouldnt that make more sense, since it's all inside a root "code" package?
It's generally a good practice to use relative imports when importing things from your own project.
Fair enough. I just tried it, no luck, it throws the same error, same line. "cannot import name Engine"
oh, duh - you have a circular dependency, main_menu_widget.py depends on engine.py and vica verca
Yep, that's a circular dependency. It's a shitty singleton too. Thanks, I posted a new question for this, but did find a way to bypass. Wish the error message was a tad more descriptive! stackoverflow.com/questions/15216424/…
|
1

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.