Первое что нам понадобится это сам boost качаем с офф сайта(ссыль) и Python 2.7 (ссыль).
Компиляцию будем проводить при помощи MinGW можно скачать как отдельно так и вместе с QT/Code::Blocks.
Разархивируем boost и правим файл bootstrap.bat.
Заменяем строчку set toolset=msvc на set toolset=gcc.
И выполняем батник(bootstrap.bat), можно открыть cmd и перетащить файлик туда (Drag&Drop).
Далее переходим в командной строке в папку с boost’ом (команда cd, переход на другой диск “D:”) и выполняем команду:
“bjam –with-python python-debugging=off threading=multi variant=release link=shared stage”
После выполнения компиляции загляним в папку “boost_1_47_0stagelib” там должны лежать два файла libboost_*.a и libboost_*.dll. Ок.
Создаем новый c++ проект.
Подключаем необходимые lib’ы. Если вы используете Code::Blocks то кликаем правой кнопкой по проекту и выбиаем “Build options…”, переходим на вкладку “Linker settings” и нажимаем “Add”. Нам необходимо добавить “Python27libslibpython27.a” и “BoostDirlibslibboost_python-mgw44-mt-1_47.dll.a”.
Должно получиться примерно так:
Далее на вкладке “Search directories” добавляем пути к папке с boost и Python27include
Всё на этом настройка проекта закончена. Переходим к написанию кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
//Подключаем заголовочные файлы #include <iostream> #include <boost/python.hpp> //Используем namespace using namespace boost::python; using namespace std; //Добавляем две глобальные переменые они нам пригодятся далее boost::python::object main_module; boost::python::object main_namespace; //Напишим простой класс с которым будем работать через Python class FirstClass { int a; float b; public: FirstClass(){ a = 5; b = 2.5f;}; int GetA(){return a;} float GetB(){return b;} void SetA(int a){this->a = a;} void SetB(float b){this->b = b;} }; int main() { char pySearchPath[] = "../../../Python27"; // Указываем путь до папки с Python. Относительно .exe Py_SetPythonHome(pySearchPath); Py_Initialize(); //Инициализируем Python main_module = boost::python::import("__main__"); //Получаем его namespace main_namespace = main_module.attr("__dict__"); // Самая важная часть биндим нашь класс main_namespace["FirstClass"] = class_<FirstClass>("FirstClass") .def("GetA",&FirstClass::GetA) .def("GetB",&FirstClass::GetB) .def("SetA",&FirstClass::SetA) .def("SetB",&FirstClass::SetB); // Создаем класс в С++ и далее мы сможем использовать его в Python FirstClass* a = new FirstClass(); a->SetA(256); a->SetB(512.5f); //Передаем указатль в Python main_namespace["fromCpp"] = ptr(a); // Выполняем бесконечный цикл и читаем с консоли то что хотим выполнить на Python'е while(true) { std::string res; std::getline(std::cin, res); PyRun_SimpleString(res.c_str()); } return 0; } |
Компилируем и запускаем. Если перед вами пустая консоль то всё ОК.
Пишем вот такую строчку
1 |
print fromCpp.GetA() |
и нажимаем Enter. Замечу НЕ надо ставить точку с запятой после вызова функции
на экран должно вывестись 256!
1 |
print fromCpp.GetB() |
512.5!
А теперь попробуем создать класс прямо в Python
1 2 |
fromPython = FirstClass() print fromPython.GetA() |
5!
1 2 |
fromPython.SetA(128) print fromPython.GetA() |
128!
На этом всё!
[jetpack_subscription_form]