Python 3: module in same directory as script: "ImportError: No module named"
I'm trying to import a module (venues
) from an IPython shell. The venues
module is correctly imported but it then tries itself to import a module named makesoup
and fails to do so.
I'm located in the ~
directory and am trying to import the venues.py
file located in the subdirectory processors
. The makesoup.py
file is also located in the processors
subdirectory, which means any Python script near it should be able to find it, right?
In [1]: import processors.venues
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-765135ed9288> in <module>()
----> 1 import processors.venues
~/processors/venues.py in <module>()
7 """
8
----> 9 import makesoup
10 import re
11
ImportError: No module named 'makesoup'
I have added an empty __init__.py
in both the ~
and processors
directories, unsuccessfully.
Note: the makesoup
module is correctly imported when I'm located in processors
but I know this is not the only way it should work.
Solution 1:
The
makesoup.py
file is also located in theprocessors
subdirectory, which means any Python script near it should be able to find it, right?
No. This feature was changed in Python 3 and that syntax no longer works.
Change the import makesoup
to this:
from . import makesoup
Or to this:
from processors import makesoup
Both of these will make it impossible to run python processors/venues.py
directly, though you can still do python -m processors.venues
from your home directory.
Solution 2:
Sometimes, this does not work:
from . import xxx
Maybe someone will tell you to add init.py under the directory. It won't work for some special cases as well.
The most useful way would be to check the sys.path first with:
import sys
print(sys.path)
Then you can find where you should import from.
There is an another way as well:
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname("__file__"), '..')))
or use insert function instead:
sys.path.insert(0, xxx)
These two ways are suitable for small project. I will recommend you choose the first one if your project is complex and huge.