251

After installing mechanize, I don't seem to be able to import it.

I have tried installing from pip, easy_install, and via python setup.py install from this repo: https://github.com/abielr/mechanize. All of this to no avail, as each time I enter my Python interactive I get:

Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mechanize
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mechanize
>>> 

The installations I ran previously reported that they had completed successfully, so I expect the import to work. What could be causing this error?

9
  • Are you sure it wasn't installed to 2.6 (which is default on ubuntu? (at least it's on my debian)
    – dav1d
    Commented Jan 12, 2013 at 17:16
  • well, the output from easy install shows it's installed to 2.7: Installed /usr/local/lib/python2.7/dist-packages/mechanize-0.2.6.dev_20130112-py2.7.egg
    – roy
    Commented Jan 12, 2013 at 17:17
  • I've just tried this every which way -- setup.py, easy_install, pip -- from pypi and the repo, but I can't get it to fail. Could you check sys.path to see if you're looking in the right places, ls -laR /usr/local/lib/python2.7/dist-packages/mech*to check for permissions trouble, and look at imp.find_module("mechanize") to distinguish between can't-find-it and can't-survive-importing-it errors?
    – DSM
    Commented Jan 12, 2013 at 17:39
  • @DSM added this info to original post
    – roy
    Commented Jan 12, 2013 at 17:53
  • @RoybertSoylend: thanks. Unfortunately that rules out both of the two theories I was considering. :-/
    – DSM
    Commented Jan 12, 2013 at 18:06

41 Answers 41

137

In my case, it is permission problem. The package was somehow installed with root rw permission only, other user just cannot rw to it!

7
  • 36
    This happened to me, just running sudo pip install .... Simple fix: sudo chmod -R ugo+rX /lib/python2.7/site-packages/
    – jozxyqk
    Commented Feb 16, 2015 at 10:04
  • 4
    I have run into this many times and I think I just discovered the reason: umask is passed through sudo, so if your personal umask is tight and you use sudo for the install, the files and directories will be over-restricted. If you simply su first and then do the install from a full root shell, the resulting install is usable (at least it is for me). This was for pip, but may apply to apt-get as well. If others confirm this cause, may want to amend the answer accordingly?
    – Brandyn
    Commented Mar 9, 2015 at 3:30
  • Adding to jozxyqk comment's: make sure you got the right directory by doing $ pip show <package_name>
    – Federico
    Commented Aug 10, 2016 at 5:05
  • 3
    Same for me. I am working with Python 3.6 on Mac, so sudo chmod 777 /usr/local/lib/python3.6/site-packages did the trick Commented May 8, 2018 at 16:20
  • 29
    sudo 777 is always very bad idea
    – Marx
    Commented Mar 30, 2020 at 12:18
134

I had the same problem: script with import colorama was throwing an ImportError, but sudo pip install colorama was telling me "package already installed".

My fix: run pip without sudo: pip install colorama. Then pip agreed it needed to be installed, installed it, and my script ran. Or even better, use python -m pip install <package>. The benefit of this is, since you are executing the specific version of python that you want the package in, pip will unequivocally install the package into the "right" python. Again, don't use sudo in this case... then you get the package in the right place, but possibly with (unwanted) root permissions.

My environment is Ubuntu 14.04 32-bit; I think I saw this before and after I activated my virtualenv.

5
  • 1
    alternatively you can use sudo's -H flag Commented Jul 14, 2017 at 15:59
  • Thanks, python -m pip install <package> show my problem. Commented Dec 15, 2021 at 11:33
  • 1
    The reason it changed without sudo is because of activating your virtualenv. That changes which executable named pip is used, to the one that will install packages to the Python in the virtualenv. Without the virtualenv activated, pip will find a version of Pip that installs to the Python that came with your operating system - which is dangerous, and exactly why you need sudo. You should effectively never do this. Many distributions of Linux deliberately remove Pip from the system Python. Commented Sep 20, 2022 at 14:26
  • Somehow pip and python pointed to separate distro or versions. Thanks!
    – dz902
    Commented Mar 21 at 2:59
  • The command python -m pip install worked for me, thanks! (Installing ultralytics) Commented Apr 26 at 17:02
34

I was able to correct this issue with a combined approach. First, I followed Chris' advice, opened a command line and typed 'pip show packagename' This provided the location of the installed package.

Next, I opened python and typed 'import sys', then 'sys.path' to show where my python searches for any packages I import. Alas, the location shown in the first step was NOT in the list.

Final step, I typed 'sys.path.append('package_location_seen_in_step_1'). You optionally can repeat step two to see the location is now in the list.

Test step, try to import the package again... it works.

The downside? It is temporary, and you need to add it to the list each time.

33

It's the python path problem.

In my case, I have python installed in:

/Library/Frameworks/Python.framework/Versions/2.6/bin/python,

and there is no site-packages directory within the python2.6.

The package(SOAPpy) I installed by pip is located

/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/

And site-package is not in the python path, all I did is add site-packages to PYTHONPATH permanently.

  1. Open up Terminal

  2. Type open .bash_profile

  3. In the text file that pops up, add this line at the end:

    export PYTHONPATH=$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/
    
  4. Save the file, restart the Terminal, and you're done

3
  • This worked for me in getting Jenkins working with selenium python.
    – edst
    Commented Sep 15, 2016 at 6:16
  • This worked for me in running celery through supervisor, when my bash script called my celery script; celery script couldn't import the already installed modules inside my pip. Thanks a ton. Commented Jul 31, 2017 at 18:28
  • Note: another possibility of the import error is that you have multiple versions of Python installed in your computer. For example, one from the system's Python and one from Miniconda or Anaconda. Therefore, be sure always to use the correct corresponding "pip".
    – Sanchit
    Commented Feb 21, 2020 at 9:10
30

The Python import mechanism works, really, so, either:

  1. Your PYTHONPATH is wrong,
  2. Your library is not installed where you think it is
  3. You have another library with the same name masking this one
8
  • 7
    It can't be option 3 in this case; that would not throw an ImportError. Commented Jan 12, 2013 at 17:21
  • 2
    maybe 2? I just don't know why it would install in the wrong place for this one library, where most others are fine.
    – roy
    Commented Jan 12, 2013 at 17:59
  • 5
    Option 4: Your PYTHONPATH is right, your library is where you want it, you don't have a library masking this... but because you used sudo pip install it got installed with root privs, and at import time something is bombing for the lack of read or write access.
    – Dan H
    Commented Apr 26, 2016 at 21:37
  • 3
    Not quite true, @MartijnPieters: if there was an import of the form "from <package> import <foo>", and if the obstructing package had no "foo", then you'd get an import error for option 3.
    – Dan H
    Commented Apr 26, 2016 at 21:38
  • 2
    @DanH sure, but that's not the form the OP is using. Commented Apr 26, 2016 at 23:03
16

I have been banging my head against my monitor on this until a young-hip intern told me the secret is to "python setup.py install" inside the module directory.

For some reason, running the setup from there makes it just work.

To be clear, if your module's name is "foo":

[burnc7 (2016-06-21 15:28:49) git]# ls -l
total 1
drwxr-xr-x 7 root root  118 Jun 21 15:22 foo
[burnc7 (2016-06-21 15:28:51) git]# cd foo
[burnc7 (2016-06-21 15:28:53) foo]# ls -l
total 2
drwxr-xr-x 2 root root   93 Jun 21 15:23 foo
-rw-r--r-- 1 root root  416 May 31 12:26 setup.py
[burnc7 (2016-06-21 15:28:54) foo]# python setup.py install
<--snip-->

If you try to run setup.py from any other directory by calling out its path, you end up with a borked install.

DOES NOT WORK:

python /root/foo/setup.py install

DOES WORK:

cd /root/foo
python setup.py install
2
  • This will depend on what the setup.py script actually does - it's Python code, after all. If the directory matters, it's because the code in the script is expecting a specific CWD - for example, because it's trying to open or move files using relative paths. Aside from that, though, this is only relevant for installing from source that you already have downloaded (or checked out from a repository), and only for setup.py based installs. It is not relevant for newer pyproject.toml-based installs, and not relevant for installing with pip from PyPI. Commented Mar 24, 2023 at 6:58
  • Nowadays, setup.py should not be run directly at all - it should only be invoked via setuptools. This is part of the long-term migration of the Python package-installation paradigm. Commented Jan 22 at 20:40
8

I encountered this while trying to use keyring which I installed via sudo pip install keyring. As mentioned in the other answers, it's a permissions issue in my case.

What worked for me:

  1. Uninstalled keyring:
  • sudo pip uninstall keyring
  1. I used sudo's -H option and reinstalled keyring:
  • sudo -H pip install keyring
6

In PyCharm, I fixed this issue by changing the project interpreter path.

File -> Settings -> Project -> Project Interpreter

File -> Invalidate Caches… may be required afterwards.

1
  • Or here's a shortcut way, if you are using PyCharm: Just File -> Settings -> Project -> Project Interpreter -> Available Packages and search for your desired package here and simply click install.
    – RAZ0229
    Commented Jun 12, 2021 at 9:58
6

Check that you are using the same python version in the interpreter of your IDE or code editor and on your system. For example, check your python version in the terminal with python3 --version And check python version for interpreter in VSCode by cmd+shift+p-> Python: Select interpreter -> select the same version as you see in your terminal.enter image description here

5

I couldn't get my PYTHONPATH to work properly. I realized adding export fixed the issue:

(did work)

export PYTHONPATH=$PYTHONPATH:~/test/site-packages

vs.

(did not work)

PYTHONPATH=$PYTHONPATH:~/test/site-packages
4

This problem can also occur with a relocated virtual environment (venv).

I had a project with a venv set up inside the root directory. Later I created a new user and decided to move the project to this user. Instead of moving only the source files and installing the dependencies freshly, I moved the entire project along with the venv folder to the new user.

After that, the dependencies that I installed were getting added to the global site-packages folder instead of the one inside the venv, so the code running inside this env was not able to access those dependencies.

To solve this problem, just remove the venv folder and recreate it again, like so:

$ deactivate
$ rm -rf venv
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install -r requirements.txt
1
  • "After that the dependencies that I installed were getting added to the global site-packages instead of the one inside venv folder." This happens because the venv is not active. However, it is true that venvs are not designed to be relocatable. The code here suggests that you are on a Linux system. It should not be possible to add anything to the "global" site-packages without using sudo. (Do not do that.) Commented Sep 20, 2022 at 14:39
3

Something that worked for me was:

python -m pip install -user {package name}

The command does not require sudo. This was tested on OSX Mojave.

0
2

In my case I had run pip install Django==1.11 and it would not import from the python interpreter.

Browsing through pip's commands I found pip show which looked like this:

> pip show Django
Name: Django
Version: 1.11
...
Location: /usr/lib/python3.4/site-packages
...

Notice the location says '3.4'. I found that the python-command was linked to python2.7

/usr/bin> ls -l python
lrwxrwxrwx 1 root root 9 Mar 14 15:48 python -> python2.7

Right next to that I found a link called python3 so I used that. You could also change the link to python3.4. That would fix it, too.

2

I had colorama installed via pip and I was getting "ImportError: No module named colorama"

So I searched with "find", found the absolute path and added it in the script like this:

import sys
sys.path.append("/usr/local/lib/python3.8/dist-packages/")
import colorama 

And it worked.

2

I had just the same problem, and updating setuptools helped:

python3 -m pip install --upgrade pip setuptools wheel

After that, reinstall the package, and it should work fine :)

The thing is, the package is built incorrectly if setuptools is old.

2

In my case it was a problem with a missing __init__.py file in the module, that I wanted to import in a Python 2.7 environment.

Python 3.3+ has Implicit Namespace Packages that allow it to create a packages without an __init__.py file.

2

Had this problem too. The package was installed on Python 3.8.0 but VS Code was running my script using an older version (3.4)

fix in terminal:

py <yourfile>.py

Make sure you're installing the package on the right Python version.

1

If the other answers mentioned do not work for you, try deleting your pip cache and reinstalling the package. My machine runs Ubuntu14.04 and it was located under ~/.cache/pip. Deleting this folder did the trick for me.

1

Also, make sure that you do not confuse pip3 with pip. What I found was that package installed with pip was not working with python3 and vice-versa.

1

I had similar problem (on Windows) and the root cause in my case was ANTIVIRUS software! It has "Auto-Containment" feature, that wraps running process with some kind of a virtual machine. Symptoms are: pip install somemodule works fine in one cmd-line window and import somemodule fails when executed from another process with the error

ModuleNotFoundError: No module named 'somemodule'
1

In my case (an Ubuntu 20.04 VM on WIN10 Host), I have a disordered situation with many version of Python installed and variuos point of Shared Library (installed with pip in many points of the File System). I'm referring to 3.8.10 Python version. After many tests, I've found a suggestion searching with google (but' I'm sorry, I haven't the link). This is what I've done to resolve the problem :

  1. From shell session on Ubuntu 20.04 VM, (inside the Home, in my case /home/hduser), I've started a Jupyter Notebook session with the command "jupyter notebook".

  2. Then, when jupyter was running I've opened a .ipynb file to give commands.

  3. First : pip list --> give me the list of packages installed, and, sympy wasn't present (although I had installed it with "sudo pip install sympy" command.

  4. Last with the command !pip3 install sympy (inside jupyter notebook session) I've solved the problem, here the screen-shot : enter image description here

  5. Now, with !pip list the package "sympy" is present, and working : enter image description here

1

In my case, I assumed a package was installed because it showed up in the output of pip freeze. However, just the site-packages/*.dist-info folder is enough for pip to list it as installed despite missing the actual package contents (perhaps from an accidental deletion). This happens even when all the path settings are correct, and if you try pip install <pkg> it will say "requirement already satisfied".

The solution is to manually remove the dist-info folder so that pip realizes the package contents are missing. Then, doing a fresh install should re-populate anything that was accidentally removed

1

Not sure if this will help anyone, but I had a similar issue on Mac M1 with zsh. Turns out I had set an alias command in my .zshrc file with the same name as my python command (python3).

To solve the issue, I just had to unalias the command. I ran:

unalias python3

both from my home terminal and from the terminal in Visual Studio.

1

I solved it by calling the following command on the terminal

eval "$(conda shell.bash hook)"

0

When you install via easy_install or pip, is it completing successfully? What is the full output? Which python installation are you using? You may need to use sudo before your installation command, if you are installing modules to a system directory (if you are using the system python installation, perhaps). There's not a lot of useful information in your question to go off of, but some tools that will probably help include:

  • echo $PYTHONPATH and/or echo $PATH: when importing modules, Python searches one of these environment variables (lists of directories, : delimited) for the module you want. Importing problems are often due to the right directory being absent from these lists

  • which python, which pip, or which easy_install: these will tell you the location of each executable. It may help to know.

  • Use virtualenv, like @JesseBriggs suggests. It works very well with pip to help you isolate and manage the modules and environment for separate Python projects.

0
0

I had this exact problem, but none of the answers above worked. It drove me crazy until I noticed that sys.path was different after I had imported from the parent project. It turned out that I had used importlib to write a little function in order to import a file not in the project hierarchy. Bad idea: I forgot that I had done this. Even worse, the import process mucked with the sys.path--and left it that way. Very bad idea.

The solution was to stop that, and simply put the file I needed to import into the project. Another approach would have been to put the file into its own project, as it needs to be rebuilt from time to time, and the rebuild may or may not coincide with the rebuild of the main project.

0

I had this problem with 2.7 and 3.5 installed on my system trying to test a telegram bot with Python-Telegram-Bot.

I couldn't get it to work after installing with pip and pip3, with sudo or without. I always got:

Traceback (most recent call last):
  File "telegram.py", line 2, in <module>
    from telegram.ext import Updater
  File "$USER/telegram.py", line 2, in <module>
    from telegram.ext import Updater
ImportError: No module named 'telegram.ext'; 'telegram' is not a package

Reading the error message correctly tells me that python is looking in the current directory for a telegram.py. And right, I had a script lying there called telegram.py and this was loaded by python when I called import.

Conclusion, make sure you don't have any package.py in your current working dir when trying to import. (And read error message thoroughly).

0

I had a similar problem using Django. In my case, I could import the module from the Django shell, but not from a .py which imported the module.
The problem was that I was running the Django server (therefore, executing the .py) from a different virtualenv from which the module had been installed.

Instead, the shell instance was being run in the correct virtualenv. Hence, why it worked.

0

This Works!!!

This often happens when module is installed to an older version of python or another directory, no worries as solution is simple. - import module from directory in which module is installed. You can do this by first importing the python sys module then importing from the path in which the module is installed

import sys
sys.path.append("directory in which module is installed")

import <module_name>
0

Most of the possible cases have been already covered in solutions, just sharing my case, it happened to me that I installed a package in one environment (e.g. X) and I was importing the package in another environment (e.g. Y). So, always make sure that you're importing the package from the environment in which you installed the package.

Not the answer you're looking for? Browse other questions tagged or ask your own question.