Как работает boost.python с Python 3? Это только Python 2?
Boost и Python 3.x
Ответ 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
Да, этот вопрос очень старый, но я должен был сделать что-то, что не было указано ни в одном из ответов здесь (хотя оно было построено на основе некоторых предложений), поэтому я быстро изложу весь процесс:
- Загрузите boost_X_Y_Z.tar.bz2 (я использовал boost 1.68.0)
-
tar --bzip2 -xf boost_1_68_0.tar.bz2
(где вы хотите, чтобы папка была временно) -
cd boost_1_68_0
-
./bootstrap.sh --with-python-version=3.6 --prefix=/usr/local
-
./b2
-
sudo./bjam install
-
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
файлов к вашему системному пути.