Как установить привязки Vowpal Wabbit Python под Travis CI? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь использовать Vowpal Wabbit из моих проектов на Python. Я могу установить привязки Python VW локально (в Ubuntu 18.04), используя pip install vowpalwabbit, пока я впервые установил зависимости сборки (apt install libboost-program-options-dev libboost-python-dev zlib1g-dev).

Я хочу запускать модульные тесты для программ на Python под Travis CI, поэтому мне нужно иметь возможность устанавливать зависимости и в среде Travis. Однако я не могу установить привязки Python VW для установки. Я создал минимальный проект , демонстрирующий проблему. Я использую самый последний xenial (т.е. на основе Ubuntu 16.04) Travis и Python версий 3.5, 3.6 и 3.7. Вот вывод Travis CI .

Проблема Python 3.5, по-видимому, вызвана ссылками на неправильную (Python 2.7) версию libboost_python.so (см., Например, эту проблему ) при сборке расширения Python. У этой проблемы был обходной путь, который включал изменение символической ссылки libboost_python.so для указания на версию Python 3.5 (вместо версии 2.7). Я пробовал это на ветке boost-py2-py3-workaround, но , похоже, не помогло .

Вот конфигурация .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 завершается неудачно с этой ошибкой ( полный журнал сборки ):

$ 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 завершается неудачно ( полный журнал сборки ):

  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 голосов
/ 15 января 2019

Я получил это работает для случая 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 и вывод сборки Travis .

Этого достаточно, чтобы тесты выполнялись хотя бы для одной версии Python, что пока нормально. Для других версий Python (3.6 и 3.7) проблема заключается в том, что нет легко доступной предварительно скомпилированной версии libboost-python, которую можно было бы просто установить в виртуальную среду Travis CI. Библиотеки libboost-python, доступные через apt-get, доступны только для Python 3.5, который является версией Python 3 по умолчанию, доступной в Ubuntu 16.04 Xenial.

...