'Attempted relative import in non-package' although packages with __init__.py in one directory

Question:

I have a module named extended.py which contains the following line:

from .basic import BasicModule

and the file basic.py resides in the same directory as does __init__.py. However, when I try to run it as:

python extended.py

I get the error:

ValueError: Attempted relative import in non-package

Also adding the line:

from __future__ import absolute_import

does not solve the problem.
Maybe I am too tired to see the obvious – but I don’t see the problem here.

Asked By: Alex

||

Answers:

Relative imports only work for packages, but when you importing in extended.py you are running a top-level module instead.

The current directory may hold a __init__.py file but that doesn’t make exended.py part of a package yet.

For something to be considered a package, you need to import the directory name instead. The following would work:

main.py

packagename
    __init__.py
    basic.py
    extended.py

then in main.py put:

import packagename.extended

and only then is extended part of a package and do relative imports work.

The relative import now has something to be relative to, the packagename parent.

Answered By: Martijn Pieters
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.