Problems with relative imports and pep 366

Jean-Michel Pichavant jeanmichel at sequans.com
Tue Jun 1 05:39:06 EDT 2010


Gabriele Lanaro wrote:
> I've yet asked this question on SO, I'll copy the contents:
>
> I have a "canonical file structure" like that (I'm giving sensible names
> to ease the reading):
>
> mainpack/
>
>   __main__.py
>   __init__.py 
>
>   - helpers/
>      __init__.py
>      path.py
>
>   - network/
>      __init__.py
>      clientlib.py
>      server.py
>
>   - gui/
>      __init__.py
>      mainwindow.py
>      controllers.py
>
> In this structure, for example modules contained in each package may
> want to access the helpers utilities through relative imports in
> something like:
>
> # network/clientlib.py
> from ..helpers.path import create_dir
>
> The program is runned "as a script" using the __main__.py file in this
> way:
>
> python mainpack/
>
> Trying to follow the PEP 366 I've put in __main__.py these lines:
>
> ___package___ = "mainpack"
> from .network.clientlib import helloclient 
>
> But when running:
>
> $ python mainpack 
> Traceback (most recent call last):
>   File "/usr/lib/python2.6/runpy.py", line 122, in _run_module_as_main
>     "__main__", fname, loader, pkg_name)
>   File "/usr/lib/python2.6/runpy.py", line 34, in _run_code
>     exec code in run_globals
>   File "path/mainpack/__main__.py", line 2, in <module>
>     from .network.clientlib import helloclient
> SystemError: Parent module 'mainpack' not loaded, cannot perform relative import
>
> What's wrong? What is the correct way to handle and effectively use
> relative imports?
>
> I've tried also to add the current directory to the PYTHONPATH, nothing
> changes.
>
> link:
> http://stackoverflow.com/questions/2943847/nightmare-with-relative-imports-how-does-pep-366-work
>
>
>   
I'm not using relative imports at all, so I can't help you on that 
point, however, did you consider using absolute imports ? The world 
becomes so simple with these :) .

BTW,

___package___ = "mainpack"


looks weird to me, are you sure it would not be better with

__package__ = "mainpack" # only 2 leading/traling underscore


JM




More information about the Python-list mailing list