无法导入已经安装的模块

237
安装了 mechanize 后,我好像无法导入它。
我尝试使用 pip、easy_install 和通过这个仓库的 python setup.py install 进行安装:https://github.com/abielr/mechanize。但每次进入 Python 交互界面时都无济于事,显示如下:
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
>>> 

我之前运行的安装程序报告说它们已经成功完成了,因此我期望导入会成功。是什么导致了这个错误?


好的,easy install 的输出显示它已经安装到了2.7版本:Installed /usr/local/lib/python2.7/dist-packages/mechanize-0.2.6.dev_20130112-py2.7.egg。 - roy
我已经尝试了各种方式——使用pypi和repo中的setup.py、easy_install、pip,但我无法让它失败。 你可以检查sys.path以查看你是否在正确的位置查找,使用ls -laR /usr/local/lib/python2.7/dist-packages/mech*检查权限问题,以及查看imp.find_module("mechanize")以区分找不到和导入错误的区别吗? - DSM
@DSM 将此信息添加到原始帖子中。 - roy
请查看以下讨论:https://dev59.com/HVwY5IYBdhLWcg3wYm8B#34797844?noredirect=1 - Dan H
你尝试使用 conda 安装它了吗? - Charlie Parker
显示剩余3条评论
40个回答

4

这个问题也可能出现在重新定位的虚拟环境(venv)中。

我的一个项目在根目录下设置了 venv。后来我创建了一个新用户,并决定将该项目移动到此用户。我没有仅移动源文件并新安装依赖项,而是将整个项目连同 venv 文件夹一起移动到了新用户。

之后,我安装的依赖项会被添加到全局 site-packages 文件夹中,而不是 venv 内部的文件夹,因此在此环境中运行的代码无法访问这些依赖项。

为解决此问题,只需删除 venv 文件夹并重新创建它,如下所示:

$ deactivate
$ rm -rf venv
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install -r requirements.txt

之后,我安装的依赖项被添加到全局site-packages而不是venv文件夹内部。这是因为venv未激活。然而,venv并不是为了可移植性而设计的。这里的代码表明您正在Linux系统上。如果没有使用sudo,不应该将任何内容添加到“全局”site-packages中。(不要这样做。 - Karl Knechtel

3

对我有用的方法是:

python -m pip install -user {package name}

该命令不需要使用sudo。这在OSX Mojave上进行了测试。

2
在我的情况下,问题出在我想要在Python 2.7环境中导入的模块中缺少了一个__init__.py文件。
Python 3.3+具有隐式命名空间包,可以创建没有__init__.py文件的包。

2

我曾经遇到过同样的问题,更新 setuptools 就解决了:

python3 -m pip install --upgrade pip setuptools wheel

在那之后,重新安装该软件包,它应该可以正常工作:)

问题在于,如果setuptools过旧,则该软件包构建不正确。


2

我通过pip安装了colorama,但是出现了"ImportError: No module named colorama"的错误。

于是我使用"find"命令查找了绝对路径,并将其添加到脚本中,如下所示:

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

它起作用了。


2
我也遇到了这个问题。该软件包已安装在Python 3.8.0上,但VS Code正在使用较旧的版本(3.4)运行我的脚本。
在终端中修复:
py <yourfile>.py

确保您在正确的Python版本上安装软件包。

2
在我的情况下,我运行了pip install Django==1.11,但是它无法从python解释器中导入。
浏览pip的命令,我发现pip show看起来像这样:
> pip show Django
Name: Django
Version: 1.11
...
Location: /usr/lib/python3.4/site-packages
...

请注意位置显示为“3.4”。我发现python命令链接到python2.7

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

我发现旁边有一个名为python3的链接,所以我使用了它。你也可以将链接更改为python3.4。这样也可以解决问题。


1
我曾遇到过类似的问题(在Windows上),我的情况根本原因是杀毒软件!它具有“自动隔离”功能,可以将运行中的进程包装在某种虚拟机中。 症状是:pip install somemodule在一个cmd-line窗口中正常工作,但从另一个进程执行import somemodule时会失败并出现错误。
ModuleNotFoundError: No module named 'somemodule'

1
如果其他答案不适用于您,请尝试删除pip的缓存并重新安装包。我的机器运行Ubuntu14.04,它位于~/.cache/pip下。删除此文件夹对我有用。

1
在我的情况下,我认为一个软件包已经安装了,因为它出现在pip freeze的输出中。然而,只有site-packages/*.dist-info文件夹就足以让pip将其列为已安装,尽管缺少实际的软件包内容(可能是由于意外删除)。即使所有路径设置正确,这种情况仍然会发生,如果您尝试pip install <pkg>,它会说“要求已满足”。
解决方法是手动删除dist-info文件夹,以便pip意识到软件包内容丢失。然后,进行全新的安装应该重新填充任何被意外删除的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接