[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://brew.sh/

常用命令: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 an xgboost subfolder with an empty __init__.py in it that is being found first by your import.

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

 

setup.py卸载方法

若安装时用(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 启动核心问题:

https://zhuanlan.zhihu.com/p/31074090

posted @ 2019-01-11 01:23  Sherrrry  阅读(837)  评论(0编辑  收藏  举报