En Sun, 08 Feb 2009 10:07:40 -0200, Geert Vancompernolle <geert.discussi...@gmail.com> escribió:

Diez B. Roggisch wrote:
Geert Vancompernolle schrieb:
Hi,

I have the following path construction:

./src/__init__.py
    /main.py
    /modules/__init__.py
            /application.py
    /ui/__init__.py
       /mainwindow/__init__.py
                  /mainwindow.py

Now I want to call the method 'MainWindow' in the module 'mainwindow', from the module 'application'.

I'm having the following import statement in 'applications.py':

from .. ui.mainwindow.mainwindow import MainWindow

That doesn't work. I've also tried many other combinations like from ..ui.mainwindow... but none of them work.

I always get the following error:

"Attempted relative import beyond toplevel package"

How can I import the method 'MainWindow' from 'mainwindow' into 'application', using the explicit relative import rules?

Or is there a better way to do this?


Rename "src" to "myapp", and start main.py from above that. That should work.



Diez
-- http://mail.python.org/mailman/listinfo/python-list

That trick did it, thanks!

But I have one more unclarity about relative import rules. Here <http://docs.python.org/tutorial/modules.html?highlight=modules>, one can find an explanation about modules in the official Python 2.6.1 documentation.

In that article, there's an example of importing relative packages (in the section "Packages").

I see the following examples:

from . import echo
from .. import formats
from ..filters import equalizer


Applying that mechanism on my application, I'm using the following construction (see my initial email):

"from .. ui.mainwindow.mainwindow import MainWindow"

But using "from ..ui.mainwindow.mainwindow import MainWindow" seems to be giving exactly the same result (mind the lacking space between ".." and "ui").

So, what's the difference (if there is one) between "from .. ui.mainwin..." and "from ..ui.mainwin..." (again, mind the difference in space)?

There is none. It's the same as:

from .    . ui  .mainwindow.  mainwindow      import     mainWindow

Whitespace is irrelevant here. The quoted examples mean:

from . import echo
import the "echo" module/package from the current package

from .. import formats
import the "formats" module/package from one level above the current package (if it is a package, it's a sibling directory; if it's a module, it's in the parent directory).

from ..filters import equalizer
import only the name "equalizer" from the "filters" module/package, located one level above the current package (same note as previous)

I guess there's a difference, otherwise it would not be given as an example in the Python documentation.

Note that examples 1 and 2 don't have any name in the "from" part; they're like a plain "import echo" or "import formats" (but telling also *where* to search for them, so it's not the same thing). The target is a module/package, as with a plain "import foo".

The third example only imports a name from another place (filters), also telling where to search for the module/package.

When you eventually grasp the concept (and I'm sure you will), could you think of a better wording/examples to improve the documentation? (I cannot see the deficiencies, just because I *already* know what it means!)

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to