Import from parent directory failed with ImportError
Question: I'm busy developing an application in python, my application is structured as
follows

    
    
    main.py
    pr/
        core/
            __init__.py
            predictor.py
        gui/
            predictor/
                __init__.py
                predict_panel.py
            __init__.py
            pr_app.py
        __init__.py
    

I launch the application using `main.py`

inside `pr_app.py` I've got

    
    
    class PrApp(wx.App):
        PREDICTOR = Predictor()
    

inside `predict_panel.py` I can successfully do

`from pr.core.predictor import Predictor`

but for some reason I cannot do

`from pr.gui.pr_app import PrApp`

I get presented with

`ImportError: cannot import name PrApp`

Is there some kind of gotcha when importing from parent directories in python,
or am I missing something?


Answer: I tried this and made a tree like yours, but with the addition of an
`__init__.py` in the `pr` directory. Without that `__init__.py` your `from
pr.core.predictor import Predictor` should fail, so I think you have it, but
forgot to write it in your question.

I was not able to get the failure you did, it worked fine for me. I can do
both imports from `predict_panel.py`, as I expected to.

However, if I from `pr_app.py` import `predict_panel`, then the import from
`predict_panel.py` of `PrApp` will fail. This is because I have a circular
import. You try to import `predict_panel` from `PrApp` during the import of
`PrApp` and you try to import `PrApp` during the import of `predict_panel`.
That would create an infinite recursion of imports, so it is not allowed.

The best way to solve this is to reorganize your code so you don't have to do
circular imports. If `PrApp` imports `predict_panel`, why would
`predict_panel` need `PrApp`? That's a sign of a flawed design.

However, the quickest way to fix it is to move one of the imports from the top
of the module into the function/method where it's called. That's bad practice,
but it will fix your problem quickly.

