无法导入已经安装的模块

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个回答

136

在我的情况下,这是一个权限问题。该软件包以root rw权限安装,其他用户无法对其进行读写!


35
这件事情发生在我身上,只是在运行sudo pip install ...。简单的解决方法是:sudo chmod -R ugo+rX /lib/python2.7/site-packages/ - jozxyqk
4
我遇到过这种情况很多次,我认为我刚刚发现了原因:umask通过sudo传递,因此如果您的个人umask很严格并且您使用sudo进行安装,则文件和目录将被过度限制。如果您先使用su,然后从完整的root shell执行安装,则生成的安装程序是可用的(至少对我来说是这样)。这是针对pip的,但可能也适用于apt-get。如果其他人确认了这个原因,可能需要相应地修改答案? - Brandyn
补充jozxyqk的评论:确保您通过执行$ pip show <package_name>获得正确的目录。 - Federico
3
我也有同感。我在Mac上使用Python 3.6,所以sudo chmod 777 /usr/local/lib/python3.6/site-packages这条命令解决了我的问题。 - Antonio Serrano
27
sudo 777 总是一个非常糟糕的主意。 - Marx
显示剩余2条评论

128
我遇到了同样的问题:带有import colorama的脚本抛出了ImportError,但是sudo pip install colorama告诉我“包已经安装好了”。
解决方法:不使用sudo运行pip:pip install colorama。然后pip会同意需要安装它,安装完成后我的脚本就可以运行了。或者更好的方法是使用python -m pip install <package>。这样的好处是,因为您正在执行要在其中安装软件包的特定版本的python,pip将无疑地将软件包安装在“正确”的python中。再次强调,在这种情况下不要使用sudo,否则您将在正确的位置获取该软件包,但可能会获得(不需要的)root权限。
我的环境是Ubuntu 14.04 32位;我想我在激活虚拟环境之前和之后都看到了这个问题。

1
你可以使用sudo的-H标志作为替代方案。 - Graydyn Young
谢谢,python -m pip install <package> 显示了我的问题。 - Thuat Nguyen
1
没有使用sudo更改的原因是激活了您的虚拟环境。这会更改使用的名为pip的可执行文件,以安装到虚拟环境中的Python。如果未激活虚拟环境,pip将找到一个版本的Pip,该版本会安装到操作系统附带的Python - 这很**危险,也正是为什么需要使用sudo**的原因。您应该从根本上永远不要这样做。许多Linux发行版故意从系统Python中删除Pip。 - Karl Knechtel

31

这是Python路径问题。

在我的情况下,我已经安装了Python:

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

在Python2.6中不存在site-packages目录。

我通过pip安装的包(SOAPpy)位于

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

而且site-package不在Python路径中,我所做的就是将site-packages永久地添加到PYTHONPATH中。

  1. 打开终端

  2. 输入open .bash_profile

  3. 在弹出的文本文件中,在末尾添加此行:

  4. export PYTHONPATH=$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/
    
  5. 保存文件,重新启动终端,就完成了


这对我来说很有效,让Jenkins与Selenium Python配合工作。 - edst
这对我在通过supervisor运行celery时非常有效,当我的bash脚本调用我的celery脚本时; celery脚本无法导入已安装的pip内的模块。非常感谢。 - Shivam Sharma
请注意:导入错误的另一个可能性是您的计算机中安装有多个版本的Python。例如,一个来自系统的Python,另一个来自Miniconda或Anaconda。因此,请务必始终使用正确相应的“pip”。 - Sanchit

31

我通过综合方法成功解决了这个问题。首先,按照Chris的建议,打开命令行并输入'pip show packagename',以显示已安装软件包的位置。

接下来,打开Python并输入'import sys',然后键入'sys.path'以显示Python搜索我导入的任何软件包的位置。不幸的是,第一步中显示的位置不在列表中。

最后一步,我输入'sys.path.append('package_location_seen_in_step_1')'。你可以选择重复第二步,以查看该位置现在出现在列表中。

测试步骤:尝试再次导入软件包......它可以工作。

缺点是什么?这是临时的,每次都需要将其添加到列表中。


28

Python的导入机制是可行的,因此可能是以下原因导致问题:

  1. 您的PYTHONPATH设置有误,
  2. 库未安装在您认为的位置上,
  3. 您有另一个同名库掩盖了这个库。

6
在这种情况下,选项3不可能是正确的选择;因为它不会抛出ImportError异常。 - Martijn Pieters
2
也许吧?我只是不知道为什么这个库会安装在错误的位置,而其他大多数库都没问题。 - roy
5
选项4:你的PYTHONPATH设置正确,你的库在你想要的位置,你没有任何遮掩库的情况......但是因为你使用了'sudo pip install'安装,它被安装为root权限,在导入时由于缺少读或写访问权限而出现问题。 - Dan H
3
不完全正确,@MartijnPieters:如果有一种形式为“from <package> import <foo>”的导入,并且阻碍导入的包没有“foo”,那么您将得到选项3的导入错误。 - Dan H
2
@DanH 没问题,但这不是 OP 所使用的表单。 - Martijn Pieters
显示剩余3条评论

16

在这个问题上,我一直在尝试解决,直到一个年轻时髦的实习生告诉我秘密:“在模块目录内运行'python setup.py install'”,然后它就奏效了。

不知道为什么,在那里运行设置使它正常工作。

明确一下,如果你的模块名是“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-->

如果你尝试通过调用其路径从任何其他目录运行setup.py,则最终会得到一个损坏的安装。

不起作用:

python /root/foo/setup.py install

有作用:

cd /root/foo
python setup.py install

这将取决于 setup.py 脚本实际执行的操作 - 毕竟它是 Python 代码。如果目录很重要,那是因为脚本中的代码期望特定的 CWD - 例如,因为它正在尝试使用相对路径打开或移动文件。除此之外,这仅适用于从已下载(或从存储库签出)的源安装,并且仅适用于基于 setup.py 的安装。它不适用于较新的基于 pyproject.toml 的安装,也不适用于从 PyPI 使用 pip 进行安装。 - Karl Knechtel

8

在我安装了sudo pip install keyring之后,遇到了这个问题。正如其他答案中提到的一样,这是一个权限问题。

对我有效的方法:

  1. 卸载keyring:
  • sudo pip uninstall keyring
  1. 我使用了sudo的-H选项并重新安装了keyring:
  • sudo -H pip install keyring

6
在PyCharm中,我通过更改项目解释器路径来解决此问题。
文件 -> 设置 -> 项目 -> 项目解释器
之后可能需要执行"文件 -> 清除缓存"。

或者,如果您使用的是PyCharm,这里有一种快捷方式:只需单击“文件->设置->项目->项目解释器->可用软件包”,在此处搜索您需要的软件包,然后单击安装即可。 - RAZ0229

5

我无法正确使用PYTHONPATH。我意识到添加export可以解决问题:

(已生效)

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

对比。

(无法工作)

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

4

请确保您在IDE或代码编辑器的解释器和系统中使用相同的Python版本。 例如,可以在终端中使用python3 --version命令检查Python版本。 并且可以通过cmd+shift+p进入VSCode的解释器选项,选择与终端中看到的版本相同的版本。enter image description here


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