Здравствуйте! У меня похожая задача, прошу совета!
Пытаюсь сделать поддержку приложением питоновских скриптов.
На данный момент связал С++ классы с питоном использую
SWIG.
Думаю информация будет полезной для сообщества, напишу подробнее о том как использовал SWIG.
Вот простой пример, исходники на С++:
example.hpp
#pragma once
#include <string>
class A
{
public:
A(void);
std::string getStr(void);
};
example.cpp
#include "example.hpp"
A::A(void) { }
std::string A::getStr(void) {
std::string str("Hello, World!");
return str;
}
Для использования SWIG'а пишу example.i
%module example
%{
#include "example.hpp"
%}
%include "std_vector.i"
%include "std_string.i"
%include "example.hpp"
Далее нужно сгенерировать исходники с помощью SWIG и откомпилировать их.
Компилирую с помощью Visual Studio 2009 из командной строки.
Для этого написал bat файл.
:: Запускаю SWIG
"C:\Program Files\SWIG\swigwin-1.3.40\swig.exe" -python -c++ example.i
@echo off
:: Устанавливаю переменные для работы cl.exe
call "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
:: Собираю исходники в DLL, которую сохраняю с расширением *.pyd
"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe" example_wrap.cxx example.cpp -I "C:\Python26\include" /link /OUT:"_example.pyd" /DLL /LIBPATH:"C:\Python26\libs"
:: Удаляю мусор
rm *.exp
rm *.lib
rm *.obj
rm *_wrap.cxx
rm *.pyc
pause
Теперь если выполнить
>>> import example
>>> x = example.A()
>>> print x.getStr()
Hello, World!
>>>
Как видим все работает!
Далее мне хотелось бы использовать в питоне объкты, которые созданы и работают в С++ коде.
Например, такой main.cpp:
#include <stdlib.h>
#include <iostream>
#include <string>
#include <python.h>
#include "example.hpp"
int main(int argc, char *argv[])
{
setlocale(LC_ALL, "Russian");
A *cppx = new A();
Py_Initialize();
PyRun_SimpleString("import example");
// тут нужно что-то сделать чтобы связать cppx и питон
PyRun_SimpleString("print cppx.getStr()");
Py_Finalize();
system("pause");
return EXIT_SUCCESS;
}
Вот теперь мне нужно передать указатель в питоновский скрипт, чтобы питон работал не с “x = example.A()” как в примере выше, а с уже созданным в C++ коде объектом cppx.
Подскажите как их связать и возможно ли это вообще.
Ведь питон теперь знает что такое класс A… он в модуле example.
Спасибо!