Ubuntu18.04系统中python3.7安装MultiNEAT库
Ubuntu18.04系统中python3.7安装MultiNEAT库
前言
MultiNEAT介绍
MultiNEAT支持标准的NEAT算法和两个关键的扩展:HyperNEAT和ES-HyperNEAT。另外,MultiNEAT库提供新奇搜索方法的实现。该库使用C ++编程语言编写,但提供了全面的Python接口。
安装问题
学习新奇搜索等进化神经算法时,需要用到MultiNEAT库,在安装时遇到了如下问题:
- 不能使用pip进行安装,在windows中可以利用
.whl
文件进行安装,而在ubuntu环境中,只能利用源码编译安装。 - 在安装MultiNEAT之前,首先需要安装boost,否则会报类似如下错误:
... ... src/PythonBindings.cpp:34:10: fatal error: boost/python.hpp: No such file or directory #include <boost/python.hpp> ^~~~~~~~~~~~~~~~~~ compilation terminated. error: command 'gcc' failed with exit status 1
boost安装
使用apt命令安装boost库
$ sudo apt-get install libboost-all-dev
MultiNEAT安装
- 首先,下载MultiNEAT.
下载完成后得到peter-ch-MultiNEAT-0dc93aa.tar.gz
文件 - 然后,安装依赖库.
由于编译过程中会使用psutil
库,因此首先安装psutil
库。$ pip3 install psutil
- 解压.
$ tar -zxvf peter-ch-MultiNEAT-0dc93aa.tar.gz
- 编译MultiNEAT
$ cd peter-ch-MultiNEAT-0dc93aa # 通过MN_BUILD环境变量来设置所需的系统(boost或cython)。 $ export MN_BUILD=boost # 编译 $ python3.7 setup.py build_ext
- 安装
$ python3.7 setup.py install
- 测试
$ python3.7 Python 3.7.7 (default, Oct 3 2020, 12:01:51) [GCC 7.5.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import MultiNEAT >>> MultiNEAT.__str__() "<module 'MultiNEAT' from '/home/brainiac/Program/python3.7/lib/python3.7/site-packages/multineat-0.5-py3.7-linux-x86_64.egg/MultiNEAT/__init__.py'>"
安装过程遇到问题及解决方法
Note
如在编译时遇到如下问题:
$ python3.7 setup.py build_ext
...
...
/usr/bin/ld: cannot find -lboost_python36
/usr/bin/ld: cannot find -lboost_numpy36
collect2: error: ld returned 1 exit status
error: command 'g++' failed with exit status 1
由于已经安装了boost库,通过搜索boost_python
与boost_numpy
可以发现,在/usr/lib/x86_64-linux-gnu
目录中包含以下文件
...
libboost_numpy3.a
libboost_numpy3-py36.a
libboost_numpy3-py36.so
libboost_numpy3-py36.so.1.65.1
libboost_numpy3.so
libboost_numpy.a
libboost_numpy-py27.a
libboost_numpy-py27.so
libboost_numpy-py27.so.1.65.1
libboost_numpy.so
...
libboost_python3.a
libboost_python3-py36.a
libboost_python3-py36.so
libboost_python3-py36.so.1.65.1
libboost_python3.so
libboost_python.a
libboost_python-py27.a
libboost_python-py27.so
libboost_python-py27.so.1.65.1
libboost_python-py36.a
libboost_python-py36.so
libboost_python.so
...
可以看到虽然不存在libboost_python36.so
和libboost_numpy36.so
,但是存在libboost_python3-py36.so
、libboost_python3.so
、libboost_python.so
、libboost_numpy3-py36.so
、libboost_numpy-py27.so
、libboost_numpy.so
,因此根据python版本可以选择使用对应的动态链接库,由于以python3.7为例,需要对文件进行修改。
使用以下方法:
在进行编译之前,首先需要修改目录下的以下两个文件.
- CMakeLists.txt
$ vim CMakeLists.txt
修改line 15 & 16,将python36
修改为python37
,numpy36
修改为numpy37
,37
即需要安装MultiNEAT的python版本号,可以根据需要进行修改,修改后如下:
...
...
find_package(Boost COMPONENTS
date_time
system
filesystem
python37
numpy37
serialization)
...
...
- setup.py
$ vim setup.py
修改line 114,将libs += ['boost_python36', "boost_numpy3"]
修改为libs += ['boost_python3', "boost_numpy3"]
修改后,相应部分如下
...
libs = ['boost_system', 'boost_serialization']
if is_python_2:
libs += ['boost_python', "boost_numpy"]
else:
# with boost 1.67 you need boost_python3x and boost_numpy3x where x is python version 3.x
libs += ['boost_python3', "boost_numpy3"] # in Ubuntu 14 there is only 'boost_python-py34'
...
然后重新编译安装、测试:
$ python3.7 setup.py clean
$ python3.7 setup.py build_ext
$ python3.7 setup.py install
$ python3.7
Python 3.7.7 (default, Oct 3 2020, 12:01:51)
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MultiNEAT
>>> MultiNEAT.__str__()
"<module 'MultiNEAT' from '/home/brainiac/Program/python3.7/lib/python3.7/site-packages/multineat-0.5-py3.7-linux-x86_64.egg/MultiNEAT/__init__.py'>"
完成后,进行测试,可以发现已正确安装。