如何在Travis CI下安装Vowpal Wabbit Python绑定?

时间:2019-01-14 12:11:22

标签: python python-3.x travis-ci boost-python vowpalwabbit

我正在尝试从我的Python项目中使用Vowpal Wabbit。只要我先安装了构建依赖项(pip install vowpalwabbit),我就可以使用apt install libboost-program-options-dev libboost-python-dev zlib1g-dev在本地安装Python VW绑定(在Ubuntu 18.04中)。

我想在Travis CI下为Python程序运行单元测试,因此我还需要能够在Travis环境中安装依赖项。但是,我无法安装Python VW绑定。我创建了一个minimal project来说明问题。我正在使用Travis和Python版本3.5、3.6和3.7的最新xenial(即基于Ubuntu 16.04的)映像。这是Travis CI output

Python 3.5问题似乎是由于在构建python扩展名时链接到错误的(Python 2.7)版本的libboost_python.so(例如参见this issue)引起的。该问题有一个解决方法,其中涉及更改符号链接libboost_python.so以指向Python 3.5版本(而不是2.7版本)。我在boost-py2-py3-workaround分支上尝试过,但是在didn't seem to help上尝试过。

这是.travis.yml的配置:

dist: xenial
language: python
python:
- '3.5'
- '3.6'
- '3.7'
cache: pip
install:
- sudo apt-get install libboost-program-options-dev libboost-python-dev zlib1g-dev
- pip install vowpalwabbit
script:
- python test-vw.py

test-vw.py脚本仅导入pyvw模块并运行一些基本命令(取自Python VW文档):

from vowpalwabbit import pyvw

vw = pyvw.vw(quiet=True)
ex = vw.example('1 | a b c')
vw.learn(ex)
print(vw.predict(ex))

我希望pip install成功,然后test-vw.py应该运行并在创建模型和打印其预测时产生一点输出。

实际结果取决于Python版本。对于Python 3.5,vowpalwabbit库似乎已成功安装,但运行Python脚本失败并显示此错误(full build log):

$ python test-vw.py Traceback (most recent call last): File "test-vw.py", line 6, in <module> from vowpalwabbit import pyvw File "/home/travis/virtualenv/python3.5.6/lib/python3.5/site-packages/vowpalwabbit/pyvw.py", line 2, in <module> import pylibvw ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0: undefined symbol: PyClass_Type The command "python test-vw.py" exited with 1.

对于Python 3.6和3.7,pip install失败(full build log):

  Using Python 3.6
  pyenv: python3.6-config: command not found

  The `python3.6-config' command exists in these Python versions:
    3.6
    3.6.7

  /usr/bin/g++ -std=c++0x  -I /usr/local/include/boost -I /usr/include -I ../rapidjson/include -fPIC -c pylibvw.cc -o pylibvw.o
  In file included from /usr/include/boost/python/detail/prefix.hpp:13:0,
                   from /usr/include/boost/python/args.hpp:8,
                   from /usr/include/boost/python.hpp:11,
                   from pylibvw.cc:14:
  /usr/include/boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory

因此,似乎有两个独立的问题,具体取决于所尝试的Python版本。我很高兴为您解决任何一个问题。

1 个答案:

答案 0 :(得分:0)

我让它适用于Python 3.5案例。关键部分是更改符号链接以指向libboost_python.so的Python 3.5版本,如.travis.yml中的这样:

install:
- sudo apt-get install libboost-program-options-dev libboost-python-dev zlib1g-dev
- sudo ln -sf /usr/lib/x86_64-linux-gnu/libboost_python-py35.a /usr/lib/x86_64-linux-gnu/libboost_python.a
- sudo ln -sf /usr/lib/x86_64-linux-gnu/libboost_python-py35.so /usr/lib/x86_64-linux-gnu/libboost_python.so
- pip install vowpalwabbit

这是boost-py2-py3-workaround分支上的working code和Travis build output

这足以使测试至少在一个Python版本上运行,目前还可以。对于其他Python版本(3.6和3.7),问题在于没有容易获得的libboost-python预编译版本可以直接安装到Travis CI虚拟环境中。通过apt-get提供的libboost-python库仅适用于Python 3.5,这是Ubuntu 16.04 Xenial中可用的默认Python 3版本。