Подтвердить что ты не робот

Boost и Python 3.x

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

4b9b3361

Ответ 1

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

Способ использования Python V3 с Boost - правильно настроить систему сборки, добавив, например:

using python : 3.1 : /your_python31_root ;

в файл user-config.jam.

Ответ 2

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.

[email protected] > 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, сделайте следующее:

[email protected] > 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/includes/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

И вы, наконец, готовы пойти:

[email protected] > 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()

Ответ 3

Если вы получаете "ошибку: нет лучшей альтернативы для /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, но нужно отредактировать его, чтобы удалить "использование python" и "/usr",..

Тогда следующее

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

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

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

Ответ 4

Когда путь к 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")

Ответ 5

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

  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 относительно неопределенного символа, пока не добавил это.

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

Ответ 6

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

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