解决Python3不能导入pip3安装包问题

最近要跑一个机器学习的demo,按照要求使用pip3命令安装好了相关的模块,结果出现了一个重大的问题,就是使用python3命令导入相关模块的时候直接出现了一个很尴尬的问题,无法查找到该模块。如下:

1
2
3
4
5
6
7
8
$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imutils
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'imutils'

pip3安装包位置与python3引用位置不同

在命令行查看一下pip3到底是什么?

1
2
3
4
$ which pip3
/usr/local/bin/pip3
$ pip3 --version
pip 9.0.1 from usr/local/lib/python3.6/site-packages

注意这里的目录usr/local/lib/python3.6/site-packages,下面我们会和它进行对比。

在命令行打开Python3的终端:

1
2
3
4
5
6
7
8
$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
>>>

看最后一个路径/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages,和我们上面pip3安装的目录usr/local/lib/python3.6/site-packages居然不一样。也就是说我们使用python3命令根本就无法导入pip3安装的模块,因为完全找不到这个目录下。有些同学可以看一下自己的python3输出结果,有的是这个:

1
2
3
4
5
6
7
8
$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', 'usr/local/lib/python3.6/site-packages']
>>>

这种情况的话就可以直接导入成功了。我也不太清楚为啥同样是Homebrew安装Python,结果有的同学是这个结果,有的同学是那个结果,不过没关系,下面我们提出解决方案。

建立一个软链将两个site-packages合并

其实我们是希望python3能够找到pip3安装的模块,但是无法找到usr/local/lib/python3.6/site-packages这个目录,我们可以将这个site-packages去掉,将它变成/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages的一个软链接,这样的话,我们使用pip3安装的模块都会直接进入/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages这个目录了,导入自然就没问题了。

1
2
3
$ cd /usr/local/lib/python3.6
$ mv site-packages site-packages.bak
$ ln -s /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages site-packages

这样软链就创建完成了,关于site-packages.bak这个目录,如果你觉的没什么用就可以直接删除了。这样我们再次使用pip3安装imutils这个模块,就会直接进入/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages这个目录。我们接下来再次使用python3导入一下这个模块:

1
2
3
4
5
6
$ python3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imutils
>>>

说明导入成功了!

其它博客的解决方案

在网上之前找了很多解决方案,其中比较多的就是说在/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages目录中建立一个.pth文件,指定另一个site-packages目录的地址,然后site.py文件会自动去查找,但是这种方案仅针对python2.7,我还没有试过,不过觉得比较麻烦,而且不一定能成功,所以就没有采取这种方法。

PyCharm安装目录

我们在使用PyCharm去安装一些模块的时候会到这里进行安装:

看到上面的项目解释器(Project Interpreter),就是我们上面提到的Python3.6.3,它的安装目录地址就是/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages,因此PyCharm在这个解释器的情况下会安装到/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages这个目录。和我们在命令行使用pip3安装模块的目录是一样的。我们使用pip3安装一些目录以后,重新打开这个窗口,就会发现这里全部显示出来了。

总结

这个应该算是Python环境里面的一个大坑了吧,对于Python不太熟悉的朋友很有可能会被这么多的安装位置搞晕,搞懵。不过我们在遇到这个问题的时候还是要冷静思考,多Google,看得多了,自己也就对这个问题慢慢熟悉了,然后才能有自己的解决方案。所以一定要有足够的Input,才能有Output。

分享到