Search code examples
pythonpython-2.7python-importimporterror

Absolute imports in python not working, relative imports work


I can't seem to get absolute imports to work in python. Here is my file structure:

a/
  b/
    __init__.py
  __init__.py
  foo.py

foo.py:

# Including or removing the __future__ import has no effect
from __future__ import absolute_import
from a import b  # just `import b` works fine
print "success!"

I instead get:

ImportError: No module named a

What in the world is going on here? I feel like I'm missing something basic. While this example is trivial, I need absolute imports to work for the real project, so just replacing the import with a relative one is not an option. I'm using python 2.7.13

None of the solutions listed here help

Thanks in advance for any insight!


Solution

  • Since it's not shown, I have to assume you're running python a/foo.py, this puts the directory of the script ('a') on the beginning of sys.path when in reality you want the current directory on the beginning of sys.path.

    You should instead run python -m a.foo which will correctly initialize the sys.path roots for your project structure.

    Here's a more in-depth writeup that I wrote on other ways this same problem can go pearshaped.

    Additionally I recorded a video on the topic: don't run python my/script.py!