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