最近将Hugo博客转移到七牛云,按照要求使用 pip3
命令安装好了相关的模块,结果出现了一个重大的问题,就是使用 python3
命令导入相关模块的时候直接出现了一个很尴尬的问题,无法查找到该模块。如下:
$ 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
到底是什么?
$ 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的终端:
$ 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
输出结果,有的是这个:
$ 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
这个目录了,导入自然就没问题了。
$ 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
导入一下这个模块:
$ 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。
Link: 解决Python3不能导入pip3安装包问题