Boost и Python 3.x - PullRequest
       19

Boost и Python 3.x

22 голосов
/ 04 апреля 2011

Как boost.python работает с Python 3?Это только Python 2?

Ответы [ 6 ]

15 голосов
/ 04 апреля 2011

Более новые версии Boost должны нормально работать с Python V3.x. Эта поддержка была добавлена ​​довольно давно, я думаю, после успешного проекта Google Summer of Code еще в 2009 году.

Чтобы использовать Python V3 с Boost, нужно правильно настроить систему сборки, добавив, например:

using python : 3.1 : /your_python31_root ;

в ваш файл user-config.jam.

6 голосов
/ 19 августа 2017

libboostpython должен быть собран с python3, чтобы сделать это. Это не работает с boost 1.58 (который поставляется с Ubuntu 16.04), поэтому убедитесь, что вы скачали последнюю версию boost. Я только что сделал это с boost_1_64_0.

Как упомянуто выше, найдите файл «user-config.jam» в вашем дистрибутиве кода и скопируйте его в $ HOME.

cp /path/to/boost_1_64_0/tools/build/example/user-config.jam $HOME

Затем отредактируйте строку python (последнюю строку) так, чтобы она гласила:

using python : 3.5 : /usr/bin/python3 : /usr/include/python3.5m : /usr/lib ;

Это верно для Ubuntu 16.04. Вы можете использовать pkg-config, чтобы найти правильный каталог include.

user@computer > pkg-config --cflags python3
-I/usr/include/python3.5m -I/usr/include/x86_64-linux-gnu/python3.5m

И вам нужен только первый каталог include.

Тогда постройте буст с нуля. (Извините.) Я устанавливаю его в / usr / local

cd /path/to/boost_1_64_0
./bootstrap.sh --prefix=/usr/local
./b2 
sudo ./b2 install

Теперь перейдите в каталог с примером Python и создайте учебник

cd /path/to/boost_1_64_0/libs/python/example/tutorial
bjam

Это не будет правильно работать, если у вас установлена ​​система boost, потому что внутри bjam связывается с libboostpython с помощью параметра g ++ "-lboost". Но в Ubuntu 16.04 он просто найдет «/usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0», и тогда привязки python не будут загружены. На самом деле вы получите его ошибку:

ImportError: /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0: undefined symbol: PyClass_Type

Если вы хотите увидеть команды g ++, которые использует bjam, сделайте следующее:

user@computer > bjam -d2 -a | grep g++
g++  -ftemplate-depth-128 -O0 -fno-inline -Wall -g -fPIC -I/usr/include/python3.5m -c -o "hello.o" "hello.cpp"
g++ -o hello_ext.so -Wl,-h -Wl,hello_ext.so -shared -Wl,--start-group hello.o  -Wl,-Bstatic  -Wl,-Bdynamic -lboost_python -ldl -lpthread -lutil -Wl,--end-group

Здесь мы видим проблему, вам нужно "-L / usr / included / lib" как раз перед "-lboost_python". Выполните это, чтобы правильно связать разделяемую библиотеку:

g++ -o hello_ext.so -Wl,-h -Wl,hello_ext.so -shared -Wl,--start-group hello.o  -Wl,-Bstatic  -Wl,-Bdynamic -L/usr/local/lib -lboost_python -ldl -lpthread -lutil -Wl,--end-group

Возможно, вам придется перезапустить ldconfig (или перезагрузить компьютер)

sudo ldconfig

И вы наконец готовы к работе:

user@computer > python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import hello_ext
>>> hello_ext.greet()
'hello, world'
>>> exit()
4 голосов
/ 30 января 2014

Если вы получаете сообщение «error: нет лучшей альтернативы для / python_for_extension», убедитесь, что

using python : 3.4 : C:\\Python34 : C:\\Python34\\include : C:\\Python34\\libs ;

только в user-config.jam в вашем домашнем пути и больше нигде.Используйте двойную обратную косую черту при компиляции под окнами с помощью mingw (toolset = gcc) или MSVC (toolset = msvc).Скомпилируйте с cmd, а не с msys, и если у вас также установлен python 2.7, удалите его из PATH в этой оболочке.Сначала выполните

bootstrap.bat gcc/msvc

, предполагая, что у вас есть инструменты gcc / msvc, доступные через PATH (/ для альтернатив, но используйте только один, или не используйте)

После этого вы также можете сделать

booststrap.sh --with-bjam=b2

в msys для создания project-config.jam, но нужно отредактировать его, чтобы удалить «using python» и «/ usr», ..

Затем следующее

b2 variant=debug/shared link=static/shared toolset=gcc/msvc > b2.log

При использовании static примеры быстрого запуска на python у меня не сработали, хотя я бы предпочел обойтись без dll boost_python.

Я не пробовал на linux, но там все должно быть проще.

1 голос
/ 28 июня 2019

Да, этот вопрос очень старый, но мне пришлось сделать что-то, что не было указано ни в одном из ответов здесь (хотя оно было построено на основе некоторых предложений), поэтому я быстро набросаю весь процесс:

  1. Скачать boost_X_Y_Z.tar.bz2 (я использовал boost 1.68.0)
  2. tar --bzip2 -xf boost_1_68_0.tar.bz2 (где вы хотите, чтобы папка была временно) *
  3. cd boost_1_68_0
  4. ./bootstrap.sh --with-python-version=3.6 --prefix=/usr/local
  5. ./b2
  6. sudo ./bjam install
  7. cp tools/build/example/user-config.jam $HOME, затем измените содержимое этого файла на using python : 3.6 : /usr/bin/python3 : /usr/include/python3.6m : /usr/lib ; (или любые другие папки, подходящие для вашей среды)

Учитывая этот исходный файл C ++ BoostPythonHelloWorld.cpp:

#include <boost/python.hpp>

char const* say_hi()
{
    return "Hi!";
}

BOOST_PYTHON_MODULE(BoostPythonHelloWorld)
{
    boost::python::def("say_hi", say_hi);
}

И этот скрипт Python BoostPythonHelloWorld.py:

import BoostPythonHelloWorld
print(BoostPythonHelloWorld.say_hi())

Его можно скомпилировать и запустить следующим образом:

gcc -c -fPIC -I/path/to/boost_1_68_0 -I/usr/include/python3.6 /other_path/to/BoostPythonHelloWorld.cpp
gcc -shared -Wall -Werror -Wl,--export-dynamic BoostPythonHelloWorld.o -L/path/to/boost_1_68_0/stage/lib -lboost_python36 -o BoostPythonHelloWorld.so
python3 BoostPythonHelloWorld.py

Часть, которая отличалась для меня, была -Wl,--export-dynamic BoostPythonHelloWorld.o, я больше нигде этого не видел, и я получал ошибку Python относительнонеопределенный символ, пока я не добавлю это.

Надеюсь, это поможет кому-то в дальнейшем!

1 голос
/ 15 октября 2018

Когда путь к Python содержит пробелы, вас ждет довольно продолжительная поездка. После долгих проб и ошибок мне наконец-то удалось получить что-то, что работает. Вот мой user-config.jam (который должен быть в моем домашнем каталоге для bjam, чтобы найти его):

import toolset : using ;

using python : 3.6
         : \"C:\\Program\ Files\ (x86)\\Microsoft\ Visual\ Studio\\Shared\\Python36_64\\python.exe\"
         : C:\\Program\ Files\ (x86)\\Microsoft\ Visual\ Studio\\Shared\\Python36_64\\include
         : C:\\Program\ Files\ (x86)\\Microsoft\ Visual\ Studio\\Shared\\Python36_64\\libs
         ;

Несоответствующее цитирование предназначено и, кажется, требуется. С этим я могу собрать boost-python и использовать его как Boost::python36 в моем CMakeLists.txt. Тем не менее, остается одна проблема: я должен вручную ссылаться на python, а именно

target_link_libraries(MyTarget
    Boost::boost Boost::python36
"C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/libs/python36.lib")
target_include_directories(MyTarget PRIVATE
    "C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/include")
0 голосов
/ 17 августа 2017

См. это , чтобы узнать, как построить boost с python.Он показывает способ сборки с python2 с помощью Visual Studio 10.0 (2010).Но я выполняю ту же процедуру для проекта, над которым я сейчас работаю, и он отлично работает с python 3.5 и Visual Studio 14.1 (2017).

Если вы получаете эту ошибку при сборкеВаш проект Python Boost, просто добавьте значение BOOST_ALL_NO_LIB к Preprocessor Definitions (внутри вкладки препроцессора C \ C ++>) в свойствах вашего проекта.
А также не забудьте добавить расположение файлов boost .dll в системный путь.

...