Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 289
lbear Avatar asked Aug 01 '17 21:08

lbear


People also ask

Should I use relative or absolute imports Python?

With your new skills, you can confidently import packages and modules from the Python standard library, third party packages, and your own local packages. Remember that you should generally opt for absolute imports over relative ones, unless the path is complex and would make the statement too long.

How do I import absolute value in Python?

Absolute imports in PythonAbsolute import involves a full path i.e., from the project's root folder to the desired module. An absolute import state that the resource is to be imported using its full path from the project's root folder.

What are the 3 types of import statements in Python?

Good practice is to sort import modules in three groups - standard library imports, related third-party imports, and local imports.


1 Answers

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!

like image 59
Anthony Sottile Avatar answered Oct 09 '22 19:10

Anthony Sottile