Python Imports – When to Use Absolute Imports

importpython

I'm changing a bunch of old python code that is occasionally running into name collisions between packages. I have a question about when absolute imports should be used and whether it would be proper to import same-level modules by name only.

/package/
/package/__init__.py
/package/subA
/package/subA/__init__.py
/package/subA/moduleA.py
/package/subA/moduleB.py
/package/subB
/package/subB/__init__.py
/package/subB/moduleA.py
/package/subB/moduleB.py

Should every import statement within the package look like:

import package.subX.moduleX

or

from package.subX import moduleX

What about in the subpackage __init__.py files. Would it be wrong to simply put

import moduleA
import moduleB

Or, in /package/subA/moduleA.py, would it be wrong to simply put:

import moduleB

Best Answer

Relative imports turned out to be a very bad idea, even though they were the default behavior for long. You can find quite a few questions on this site where someone simply named their file after a builtin module and broke their application with weird error messages.

That's why it's always a good to do absolute imports by referencing your project everywhere, including packages.

In short, use this style:

import myproject.mypackage
from myproject.mypackage.myfile import MyClass

Quote from PEP8:

Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. Even now that PEP 328 is fully implemented in Python 2.5, its style of explicit relative imports is actively discouraged; absolute imports are more portable and usually more readable.

Related Question