[Python Debug] How to install external python package? MAC系统下的xgboost安装
从昨天晚上开始安装xgboost,经历了各种稀奇古怪的错误,终于现在程序可以跑起来了。整个过程对python编译环境,路径设置,package安装方法有了一定了解,当然还有一些疑惑,所以姑且做个记录。
系统:Mac OS Mojave 10.14
IDE:Anaconda (严格来讲,Anaconda属于python的一个集成环境,集成了Spyder IDE,以及conda等数据包)
安装homebrew
因为很例如gcc等工具都没有安装,所以根据网上的推荐,安装homebrew。
homebrew是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 使用命令,非常方便。
常用命令:https://www.jianshu.com/p/28cbe523d08e
安装方式很简单,就是在terminal里输入以下command:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)
但是这一步我就悲剧了,因为我的电脑一直上不了GitHub。。。
这个问题困扰了我很久,自从去年暑假,我的macbook莫名其妙的打不开又莫名其妙的好了之后,我就上不了github了,所以无论是浏览器还是terminal,我得到的结果都是timeout error。
我之前就有尝试搜索过解决方案,但是搜到的都是类似下面这个链接说的修改hosts文件
https://blog.csdn.net/sinat_30162391/article/details/53160568
然而对我并没有用处,而且为了修改hosts我还顺便学习了一下VI编辑器,后来发现其实把hosts复制到桌面,修改后再覆盖原文件就可以了>_<
打开终端(应用程序——实用工具),运行:
sudo vi /etc/hosts
屏幕上会提示你输入密码,打开 hosts 文件之后按 i 键进入插入模式(可理解为编辑模式),然后按照你的需要对该文件进行编辑,编辑完成之后按 ESC 键退出插入模式,之后按 :wq回车保存退出,记得英文的冒号也是要输入的哦。
顺便提一下,这时候还遇到了Error E13:File exists (add ! to override),
从这篇里找到灵感,把保存和退出指令改成了:w!和:q!。
当然这并没有解决问题,于是我试着用英文关键词搜索,但是基本上都是公司代理的问题,比如:(太可怕了,把链接备份一下防止以后要用。。)
https://github.com/npm/npm/issues/10037
https://apple.stackexchange.com/questions/228865/how-to-install-an-homebrew-package-behind-a-proxy
不过功夫不负有心人,被我找到一篇非常详尽的(中文的)攻略!
https://www.crifan.com/git_clone_failed_to_connect_to_github_com_port_443_operation_timed_out/
真的是超级详细的,有各种试验和搜索关键词。我照着从头试到尾,然而最终的解决方法就是:
把hosts文件里包含git的所有行都删掉!
ORZ...这是认真的嘛,那之前blog里面还让添加ip映射什么的不是在开玩笑么🤷♀️计算机的世界真是扑朔迷离啊~
至此,我的homebrew安装成功了,Github也能上了,可以愉快地做一个程序员了耶!
安装xgboost
然而一切并没有因此而一帆风顺,这里以xgboost为例,总结一下python常用的package安装方法,以及我遇到的各种问题。
方法一:pip安装
这是最通用的方法,也是我最后成功的方法,并且python可以自动检索到。通用的指令格式是
pip install package_name
但是如果直接在mac上安装会出错,据说是因为不支持OpenMP(因为我之前一直在试其他方法,后来直接找到了一个完美解决方案,所以并没有遇到这个问题)
解决方法是首先安装llvm(llvm是Mac下的一个编译器,可以用来编译C和C++程序.最新的llvm已经包含了OpenMP. 注意, Mac下的XCode带有clang编译器, 但是是不支持OpenMP的,所以不能用来编译XGBoost.)
brew install llvm
然后安装clang-omp(注意:clang-omp已经从HomeBrew移除,运行brew install clang-omp的时候报错:Error: No available formula with the name "clang-omp")
其实可以将上一行命令改为(这里似乎因为llvm已经安装最新版所以也不需要修改,xgboost直接可以安装成功。)
brew install --with-clang llvm
最后就可以安装xgboost啦
pip install xgboost
安装完成后xgboost就出现在conda的列表里
conda list
然后进入python环境就可以使用了。
import xgboost xgboost.__version__
Out: "0.81"
方法二:Conda安装
首先从terminal里面直接输入conda安装命令也是行不通的
conda install xgboost
PackagesNotFoundError: The following packages are not available from current channels:
- xgboost
根据这篇文章,可以用下面的指令搜索,然后根据自己的系统版本及python环境找到合适的xgboost版本进行安装。
anaconda search -t conda xgboost
好吧,输出了一堆类似这样的信息,我表示实在不知道该选哪一个,于是放弃了这个方法。
方法三:从Github下载源文件并安装
这是xgboost官网推荐的方法。好处是可以支持GPU多线程,但是我因为包的路径不会设,所以安装之后总是import不进去,姑且先用前面的方法安装吧。
网上有很多这个方法的教程,方法是一样的,但是细节上会有些出入,主要是要修改gcc的版本、设置安装路径以及build.sh运行:
英文版:https://stackoverflow.com/questions/39315156/how-to-install-xgboost-in-python-on-macos
中文版:https://blog.csdn.net/sinat_20177327/article/details/81048772
首先安装最新版的gcc:
brew install gcc --without-multilib
这里提一下,brew安装了最新版的gcc-8,但是系统默认的老版本还是4,所以如果要用新安装的版本需要指定gcc-8,如下面的例子:
也可以进入brew的安装文件夹/usr/local/bin/去看,都是8。。。:
最后,这篇文章教了如何修改系统默认的gcc。
下载xgboost的git源码:
git clone --recursive https://github.com/dmlc/xgboost
这里下载的路径也很重要,最好下载到Anaconda/pkgs。我觉得我最后调用不成功的原因就是我把安装包下载到根目录了,然后又不太会设置搜索路径。
修改XGBoost的config文件:
cd xgboost
cp make/config.mk ./config.mk
这里可以用各种编辑器,比如我们刚学到的VI编辑器><
vi config.mk
把以下两行
# export CC = gcc
# export CXX = g++
修改为
export CC = gcc-8
export CXX = g++-8
同时修改xgboost/Makefile
export CC = $(if $(shell which clang), clang, gcc) ... ... export CXX = $(if $(shell which clang++), clang++, g++)
改成
export CC = $(if $(shell which clang), clang, gcc-8) ... ... export CXX = $(if $(shell which clang++), clang++, g++-8)
其实我当时改的应该是错的,我按照stack overflow里的回答改成了gcc-6,但其实应该按自己实际安装的版本修改,不晓得为什么也并没有报错,只是安装之后用不了。。
Run a cleaning step:
make clean_all && make -j4
不知道怎么翻译,据说是因为修改了makefile所以需要编译一下。
执行build.sh
./build.sh
这一步有的文章说要执行,有的文章没有,我当时是没有执行,所以不确定是不是因为这个原因出错了。
安装xgboost
cd python-package;
python setup.py install
import问题
我最先尝试的是第三个安装方法,安装的过程并没有报错,但是import的时候遇到了一些问题。很奇怪的是,我在Spyder里面import并不会报错,但是不能调用任何attribute。比如调用XGBRegressor会报错:
module 'xgboost' has no attribute 'XGBRegressor'
后来我用terminal调用ipython,再import xgboost,就直接XGBoostLIbraryNotFound:
从这里看,可能是因为没有运行build.sh,另外这里有一个同样的问题,及解答:
Since your
dir
call is missing basically everything, my suspicion is that wherever you're starting your script from has anxgboost
subfolder with an empty__init__.py
in it that is being found first by yourimport
.If you're using anaconda, it should drop packages in
[your anaconda install folder]/lib/python3.5/site-packages
所以也可能是名字冲突的问题,有一个感觉可行的方案:
We probably have the same problem.
I solved it by telling Python explicitly where to find xgboost library.
The reason is that I have more than one scripts with the name xgboost.py. Python might have imported one of them mistakenly, so that it cannot find the definition of 'XGBRegressor'.
Here is the command I used:
export PYTHONPATH=PATH_TO_YOUR_setup.py_file
For me, PATH_TO_YOUR_setup.py_file is ~/xgboost/python-package
还找了另外一些添加PYTHONPATH的方法:
https://blog.csdn.net/machinezj/article/details/60137666
https://blog.csdn.net/jasonzzj/article/details/53941147
https://blog.csdn.net/wuguangbin1230/article/details/79617113
事实上,对于系统里多个python版本的system path还是很困惑,所以最后也没有成功。
于是我把所有安装的xgboost都卸载了(之前还有尝试用conda安装了一个低版本的xgboost,但不确定有没有卸载干净),关于第三种安装方法的卸载我参考了这里,另外两种分别用以下command:
pip uninstall xgboost
conda remove xgboost
然后用了第一种方法安装了xgboost,姑且先用着,等空一点的时候再把多线程的方法试一试。
真的是历经坎坷,希望过几天安装TensorFlow的时候可以顺利点✌️
===================
更新:
了解了一下用setup.py安装第三方包的步骤(看来build还是需要的呀):
- 先下载你要安装的包,并解压到磁盘下;
- 进入到该文件的setup.py 目录下 ,打开cmd,并切换到该目录下;
- 先执行 python setup.py build
- 然后执行 python setup.py install
conda安装目录:
root环境下安装库文件的目录为:
/Users/zj_macbook/anaconda/lib/python2.7/site-packages
python27环境下安装库文件的目录为:
/Users/zj_macbook/anaconda/envs/python27/lib/python2.7/site-packages
python3环境下安装库文件的目录为:
/Users/zj_macbook/anaconda/envs/python3/lib/python3.6/site-packages
brew安装目录:
库文件位置
/usr/local/lib/python2.7/site-packages
可执行程序:
brew会为程序创建链接,位于:
/usr/local/bin
实际安装位置
/usr/local/Cellar
pip安装目录:
库文件位置:
/usr/local/lib/python2.7/site-packages
若安装时用(log记录安装细节)
python setup.py install --record log
则卸载时
cat log | xargs rm -rf
如果安装时没有加--record,卸载的时候可以先用第一句重新安装,再用第二句卸载?(表示怀疑,看到有人说直接删文件夹就可以)
最后附上两篇多个python环境下会遇到的问题:
安装anaconda记:https://goldengrape.github.io/posts/python/install-anaconda/
Anaconda & ipython路径问题 & jupyter notebook 启动核心问题: