I'm trying to follow PEP 328, with the following directory structure:
pkg/ __init__.py components/ core.py __init__.py tests/ core_test.py __init__.py
core_test.py I have the following import statement
from ..components.core import GameLoopEvents
However, when I run, I get the following error:
tests$ python core_test.py Traceback (most recent call last): File "core_test.py", line 3, in <module> from ..components.core import GameLoopEvents ValueError: Attempted relative import in non-package
Is there anything I'm missing here?
Yes. You're not using it as a package.
python -m pkg.tests.core_test
To elaborate on Ignacio Vazquez-Abrams's answer:
The Python import mechanism works relative to the
__name__ of the current file. When you execute a file directly, it doesn't have its usual name, but has
"__main__" as its name instead. So relative imports don't work.
You can, as Igancio suggested, execute it using the
-m option. If you have a part of your package that is meant to be run as a script, you can also use the
__package__ attribute to tell that file what name it's supposed to have in the package hierarchy.
See http://www.python.org/dev/peps/pep-0366/ for details.