Установка библиотеки Quantlib Python PyQL: похоже, не удается найти Boost

Я пытаюсь установить библиотеку Python PyQL, которая обертывает Quantlib, но, похоже, не может найти некоторые заголовки boost.

У меня уже есть последняя рабочая версия Quantlib (1.3), которая находится в каталоге /usr/local/lib вместе с Boost 1.5:

xxx@LILJEN:/usr/local/lib$ ls
boost  boost_1_50_0  libQuantLib.a  libQuantLib.la  libQuantLib.so  libQuantLib.so.0  libQuantLib.so.0.0.0  python2.7  python3.3  QuantLib-1.3  QuantLib-SWIG-1.3  R  site_ruby

У меня установлен Cython 0.2:

>>> pkg_resources.get_distribution("Cython").version
'0.20'

Когда я захожу в каталог pyql, где я загрузил пакет, и выполняю команду make build, я получаю проблему с библиотекой Boost, так как в противном случае кажется, что все правильно "Cythonizing". Я отмечаю, что в инструкциях Github сказано, что я должен «исправить» Cython 0.16, но, поскольку я уже на 0.2, я предполагаю, что в этом нет необходимости. Вот что говорит сборка:

xxx@LILJEN:~/Downloads/pyql$ sudo make build
python setup.py build_ext --inplace
/usr/lib/python2.7/distutils/extension.py:133: UserWarning: Unknown Extension options: 'pyrex_directives'
  warnings.warn(msg)
missing cimport in module 'quantlib.time': quantlib/instruments/credit_default_swap.pyx
missing cimport in module 'quantlib.pricingengines': quantlib/instruments/credit_default_swap.pyx
missing cimport in module 'quantlib.pricingengines': quantlib/instruments/option.pyx
Compiling quantlib/quotes.pyx because it changed.
Compiling quantlib/interest_rate.pyx because it changed.
Compiling quantlib/time/calendar.pyx because it changed.
Compiling quantlib/time/schedule.pyx because it changed.
Compiling quantlib/time/date.pyx because it changed.
Compiling quantlib/time/daycounter.pyx because it changed.
Compiling quantlib/time/daycounters/actual_actual.pyx because it changed.
Compiling quantlib/time/daycounters/thirty360.pyx because it changed.
Compiling quantlib/time/calendars/germany.pyx because it changed.
Compiling quantlib/time/calendars/united_states.pyx because it changed.
Compiling quantlib/time/calendars/united_kingdom.pyx because it changed.
Compiling quantlib/time/calendars/null_calendar.pyx because it changed.
Compiling quantlib/time/calendars/jointcalendar.pyx because it changed.
Compiling quantlib/instruments/swap.pyx because it changed.
Compiling quantlib/pricingengines/credit.pyx because it changed.
Compiling quantlib/pricingengines/swap.pyx because it changed.
Compiling quantlib/pricingengines/bond.pyx because it changed.
Compiling quantlib/pricingengines/blackformula.pyx because it changed.
Compiling quantlib/pricingengines/engine.pyx because it changed.
Compiling quantlib/pricingengines/vanilla/mcvanillaengine.pyx because it changed.
Compiling quantlib/pricingengines/vanilla/vanilla.pyx because it changed.
Compiling quantlib/sim/simulate.pyx because it changed.
Compiling quantlib/processes/bates_process.pyx because it changed.
Compiling quantlib/processes/black_scholes_process.pyx because it changed.
Compiling quantlib/processes/heston_process.pyx because it changed.
Compiling quantlib/math/optimization.pyx because it changed.
Compiling quantlib/termstructures/default_term_structure.pyx because it changed.
Compiling quantlib/termstructures/credit/piecewise_default_curve.pyx because it changed.
Compiling quantlib/termstructures/credit/default_probability_helpers.pyx because it changed.
Compiling quantlib/termstructures/volatility/equityfx/black_vol_term_structure.pyx because it changed.
Compiling quantlib/termstructures/yields/yield_term_structure.pyx because it changed.
Compiling quantlib/termstructures/yields/zero_curve.pyx because it changed.
Compiling quantlib/termstructures/yields/piecewise_yield_curve.pyx because it changed.
Compiling quantlib/termstructures/yields/rate_helpers.pyx because it changed.
Compiling quantlib/termstructures/yields/flat_forward.pyx because it changed.
Compiling quantlib/models/equity/bates_model.pyx because it changed.
Compiling quantlib/models/equity/heston_model.pyx because it changed.
Cythonizing quantlib/instruments/swap.pyx
Cythonizing quantlib/interest_rate.pyx
Cythonizing quantlib/math/optimization.pyx
Cythonizing quantlib/models/equity/bates_model.pyx
Cythonizing quantlib/models/equity/heston_model.pyx
Cythonizing quantlib/pricingengines/blackformula.pyx
Cythonizing quantlib/pricingengines/bond.pyx
Cythonizing quantlib/pricingengines/credit.pyx
Cythonizing quantlib/pricingengines/engine.pyx
Cythonizing quantlib/pricingengines/swap.pyx
Cythonizing quantlib/pricingengines/vanilla/mcvanillaengine.pyx
Cythonizing quantlib/pricingengines/vanilla/vanilla.pyx
Cythonizing quantlib/processes/bates_process.pyx
Cythonizing quantlib/processes/black_scholes_process.pyx
Cythonizing quantlib/processes/heston_process.pyx
Cythonizing quantlib/quotes.pyx
Cythonizing quantlib/sim/simulate.pyx
Cythonizing quantlib/termstructures/credit/default_probability_helpers.pyx
Cythonizing quantlib/termstructures/credit/piecewise_default_curve.pyx
Cythonizing quantlib/termstructures/default_term_structure.pyx
Cythonizing quantlib/termstructures/volatility/equityfx/black_vol_term_structure.pyx
Cythonizing quantlib/termstructures/yields/flat_forward.pyx
Cythonizing quantlib/termstructures/yields/piecewise_yield_curve.pyx
Cythonizing quantlib/termstructures/yields/rate_helpers.pyx
Cythonizing quantlib/termstructures/yields/yield_term_structure.pyx
Cythonizing quantlib/termstructures/yields/zero_curve.pyx
Cythonizing quantlib/time/calendar.pyx
Cythonizing quantlib/time/calendars/germany.pyx
Cythonizing quantlib/time/calendars/jointcalendar.pyx
Cythonizing quantlib/time/calendars/null_calendar.pyx
Cythonizing quantlib/time/calendars/united_kingdom.pyx
Cythonizing quantlib/time/calendars/united_states.pyx
Cythonizing quantlib/time/date.pyx
Cythonizing quantlib/time/daycounter.pyx
Cythonizing quantlib/time/daycounters/actual_actual.pyx
Cythonizing quantlib/time/daycounters/thirty360.pyx
Cythonizing quantlib/time/schedule.pyx
running build_ext
building 'quantlib.cashflow' extension
creating build
creating build/temp.linux-x86_64-2.7
creating build/temp.linux-x86_64-2.7/quantlib
x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DHAVE_CONFIG_H -I/usr/local/include -I/usr/include -I. -I./cpp_layer -I/usr/include/python2.7 -c quantlib/cashflow.cpp -o build/temp.linux-x86_64-2.7/quantlib/cashflow.o
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++ [enabled by default]
quantlib/cashflow.cpp:342:32: fatal error: boost/shared_ptr.hpp: No such file or directory
 #include "boost/shared_ptr.hpp"
                                ^
compilation terminated.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
make: *** [build] Error 1

Кажется, он не может найти библиотеку boost, хотя она явно установлена ​​и работает, поскольку я успешно скомпилировал Quantlib с нуля, и набор тестов работает. Любые подсказки относительно того, где я мог получить что-то неправильно?

Это Ubuntu 13.10 и установленный по умолчанию Python 2.7. По сути, это недавно установленная система со всеми последними библиотеками (кроме Boost, который я оставил на уровне 1.5).

Установка Fwiw python setup.py тоже не работает, но у меня обычная библиотека SWIG Quantlib отлично работает в Python.


ПРИЛОЖЕНИЕ

Я считаю, что моя «ошибка» заключается в том, что я внимательно следил за эта отличная страница о том, как установить Quantlib на Ubuntu. На этой странице говорится о Boost в каталоге usr/local/lib, и я скопировал и вставил его команды. Quantlib скомпилирован идеально, потому что каталог Boost был передан через команду экспорта в соответствии со страницей, но pyql также должен был указать этот каталог в setup.py. Это вопрос обеспечения того, чтобы строка под sys.platform = "linux2" указывала INCLUDE_DIRS на usr/local/lib, а не на usr/local/include по умолчанию. Я пишу это дополнение, потому что считаю, что многие пользователи могут также выполнить поиск в Google «установить Quantlib Ubuntu» и найти эту страницу, поэтому эта проблема может повториться для некоторых людей.


person Thomas Browne    schedule 20.01.2014    source источник
comment
Где ваши заголовки Boost? Они находятся в /usr/local/include или где-то еще?   -  person Luigi Ballabio    schedule 21.01.2014
comment
Я вижу их в /usr/local/lib. В любом случае там я вижу каталог boost_1_50_0, а под ним я вижу каталог с именем boost. Я предполагаю, что это заголовки Boost? Вы можете увидеть содержимое моей папки /usr/local/lib вверху моего вопроса.   -  person Thomas Browne    schedule 21.01.2014
comment
Есть ли, например, файл shared_ptr.hpp внутри /usr/local/lib/boostshared_ptr.hpp50_0/boost? Это то, что ищет компилятор.   -  person Luigi Ballabio    schedule 21.01.2014
comment
Действительно есть: ......xxx@LILJEN:/usr/local/lib/boost_1_50_0/boost$ ls sh* ......shared_array.hpp shared_container_iterator.hpp shared_ptr.hpp...... , Может быть, мне нужно отредактировать setup.py, чтобы он мог его найти? Я использую setup.py по умолчанию, найденный в pyql github. Кажется, у него есть местоположения по умолчанию для различных операционных систем, и для Debian кажется, что все должно работать без изменений, но, возможно, мне нужно их изменить?   -  person Thomas Browne    schedule 22.01.2014
comment
возможно, мне следует переместить место, откуда я пытаюсь построить pyql? В настоящее время я делаю это из каталога pyql в моем домашнем каталоге, тогда как boost находится в usr/local/lib?   -  person Thomas Browne    schedule 22.01.2014


Ответы (1)


Если вы посмотрите на командную строку, которая запускает компилятор, вы увидите

-I/usr/local/include -I/usr/include -I. -I./cpp_layer -I/usr/include/python2.7

которые являются флагами, которые сообщают компилятору, где искать заголовки. Ваши заголовки Boost не находятся ни в одном из них (что странно: заголовки обычно находятся где-то в /usr/local/include. Вы сами скопировали их в /usr/local/lib?), поэтому компилятор не может их найти.

Вы также можете:

  • переместите каталог boost в /usr/local/include (это будет каталог с именем «boost», а не тот, который называется «boost
    -I/usr/local/include -I/usr/include -I. -I./cpp_layer -I/usr/include/python2.7
    
    50_0»), или
  • передать дополнительный флаг -I/usr/local/lib/boost_1_50_0 компилятору, чтобы он мог найти их в их текущем местоположении. Способ сделать это будет зависеть от вашего сценария setup.py.
person Luigi Ballabio    schedule 22.01.2014
comment
Успех! В файле setup.py для INCLUDE_DIRS установлено значение /usr/local/include, а для LIBRARY_DIRS установлено значение usr/local/lib. Будучи новичком в Linux, я подумал, что если LIBRARY_DIRS будет правильным, то это как-то сработает. Отредактировав setup.py в правильном каталоге, вы увидите, что все работает и работает набор тестов. Однако еще один вопрос: как включить эту обновку? import pyql или import PyQL ничего не видит. Тем не менее, я знаю, что это работает, потому что sudo make test работал отлично. - person Thomas Browne; 22.01.2014
comment
Не обращайте внимания на последнюю строку предыдущего комментария. Все примеры работают правильно. Он импортируется как quantlib и работает отлично. Смущал, потому что именно так и импортируется SWIG-версия (возможно, с большой буквы Q, не помню). Все хорошо и работает отлично. - person Thomas Browne; 22.01.2014