How to fix “ImportError: No module named …” error in Python?

What is the correct way to fix this ImportError error?

I have the following directory structure:

/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo

And I am in the directory

/home/bodacydo/work/project

Now if I type

python ./programs/my_python_program.py

I instantly get

ImportError: No module named foo.tasks

The ./programs/my_python_program.py contains the following line:

from foo.tasks import my_function

I can’t understand why python won’t find ./foo/tasks.py – it’s there.

If I do it from the Python shell, then it works:

python
>>> from foo.tasks import my_function

It only doesn’t work if I call it via python ./programs/my_python_program.py script.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

Python does not add the current directory to sys.path, but rather the directory that the script is in. Add /home/bodacydo/work/project to either sys.path or $PYTHONPATH.

Method 2

Do you have a file called __init__.py in the foo directory? If not then python won’t recognise foo as a python package.

See the section on packages in the python tutorial for more information.

Method 3

A better fix than setting PYTHONPATH is to use python -m module.path

This will correctly set sys.path[0] and is a more reliable way to execute modules.

I have a quick writeup about this problem, as other answerers have mentioned the reason for this is python path/to/file.py puts path/to on the beginning of the PYTHONPATH (sys.path).

Method 4

Here is a step-by-step solution:

  1. Add a script called run.py in /home/bodacydo/work/project and edit it like this:
    import programs.my_python_program
    programs.my_python_program.main()

    (replace main() with your equivalent method in my_python_program.)

  2. Go to /home/bodacydo/work/project
  3. Run run.py

Explanation:
Since python appends to PYTHONPATH the path of the script from which it runs, running run.py will append /home/bodacydo/work/project. And voilà, import foo.tasks will be found.

Method 5

Example solution for adding the library to your PYTHONPATH.

  1. Add the following line into your ~/.bashrc or just run it directly:
    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. Then link your required library into your ~/.python folder, e.g.
    ln -s /home/user/work/project/foo ~/.python/

Method 6

In my mind I have to consider that the foo folder is a stand-alone library. I might want to consider moving it to the Libsite-packages folder within a python installation. I might want to consider adding a foo.pth file there.

I know it’s a library since the ./programs/my_python_program.py contains the following line:

from foo.tasks import my_function

So it doesn’t matter that ./programs is a sibling folder to ./foo. It’s the fact that my_python_program.py is run as a script like this:

python ./programs/my_python_program.py

Method 7

If you have this problem when using an instaled version, when using setup.py, make sure your module is included inside packages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x