最近要跑一个机器学习的demo,按照要求使用pip3
命令安装好了相关的模块,结果出现了一个重大的问题,就是使用python3
命令导入相关模块的时候直接出现了一个很尴尬的问题,无法查找到该模块。如下:
1 | $ python3 |
pip3安装包位置与python3引用位置不同
在命令行查看一下pip3
到底是什么?
1 | $ which pip3 |
注意这里的目录usr/local/lib/python3.6/site-packages
,下面我们会和它进行对比。
在命令行打开Python3的终端:
1 | $ python3 |
看最后一个路径/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
,和我们上面pip3
安装的目录usr/local/lib/python3.6/site-packages
居然不一样。也就是说我们使用python3
命令根本就无法导入pip3
安装的模块,因为完全找不到这个目录下。有些同学可以看一下自己的python3
输出结果,有的是这个:
1 | $ python3 |
这种情况的话就可以直接导入成功了。我也不太清楚为啥同样是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 | $ cd /usr/local/lib/python3.6 |
这样软链就创建完成了,关于site-packages.bak
这个目录,如果你觉的没什么用就可以直接删除了。这样我们再次使用pip3
安装imutils
这个模块,就会直接进入/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
这个目录。我们接下来再次使用python3
导入一下这个模块:
1 | $ python3 |
说明导入成功了!
其它博客的解决方案
在网上之前找了很多解决方案,其中比较多的就是说在/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。