LINUX.ORG.RU

Embedding Python in C++

 , , ,


0

2

Решил заняться сабжем, изучил включение по сайту. Использую их пример:

 #include <Python.h>

int main(int argc, char *argv[])
{
	  
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

    if (argc < 3) 
    {
        printf("Usage: name python_source function_name\n");
        return 1;
    }

    // Initialize the Python Interpreter
    Py_Initialize();
  
    // Build the name object
    pName = PyString_FromString(argv[1]);
  
    // Load the module object
    pModule = PyImport_Import(pName);
  
    // pDict is a borrowed reference 
    pDict = PyModule_GetDict(pModule);
  
    // pFunc is also a borrowed reference 
    pFunc = PyDict_GetItemString(pDict, argv[2]);
  
    if (PyCallable_Check(pFunc)) 
    {
        PyObject_CallObject(pFunc, NULL);
    } else 
    {
        PyErr_Print();
    }

    // Clean up
    Py_DECREF(pModule);
    Py_DECREF(pName);

    // Finish the Python Interpreter
    Py_Finalize();

    return 0;
}

Компилирую командой:

 g++ testing.cpp -I/usr/include/python2.7 -lpython2.7 -otr

Получаю сегфолт. ddd на эту тему говорит:

 Program received signal SIGSEGV, Segmentation fault.
0xb7de901a in PyModule_GetDict () from /usr/lib/libpython2.7.so.1.0
(gdb) 
Ubuntu 12.04. Помогите с проблемой.

Ответ на: комментарий от tailgunner

Я нашел такое решение:

    Py_Initialize();
    FILE *fp=fopen("foo.py","r+"); 
    PyRun_SimpleFile(fp,"foo.py");
    Py_Finalize();
Но как мне сделать так, чтобы этот файл возвращал мне что-либо. В main в питоновском файле просто return'ом сделать?

morpheus ()
Ответ на: комментарий от morpheus

Я не встраиваю Python в приложения - по крайней мере так, как ты. Ты хочешь вызвать Python-функцию и получить ее значение?

tailgunner ★★★★★ ()
Ответ на: комментарий от morpheus

Нужен универсальный алоритм.

Подозреваю, что тебе нужен Boost.Python

А ты как делаешь?

А я вызываю Си-функции через ctypes (из встроенного или автономного интерпретатора).

tailgunner ★★★★★ ()
Ответ на: комментарий от morpheus

В моем случае - в основном встраивание Си в Python, и немного - Python в Си.

tailgunner ★★★★★ ()
Ответ на: комментарий от morpheus

А... зачем? С/С++ в питон понятно - ускоряем критичные по быстродействию места. А наоборот? Замедляем некритичные места, или юзаем сугубо питонячьи либы?;-)

Про встраивание С++ в питон вота http://a-iv.ru/pyart/cpp2py.pdf

Если наоборот, ну чего... надо написать некую ф-ю, которая соберет аргументы, толканет их в питон и сконвертит результат назад в С. Либо руками через PyAPI (завернуть там в шаблоны какие нить при необходимости что бы много букв не писать), но подозреваю что это кто то уже сделал... м.б. как раз буст питон это оно самое?;-)

AIv ★★★★★ ()

Использую их пример

Но как мне сделать так, чтобы этот файл возвращал мне что-либо. В main в питоновском файле просто return'ом сделать?

Ну, тогда нужно было просто дочитать до подходящего примера.

Я начинал с него. И всё ОК, пока не хочешь сделать из этого динамически подгружаемый плагин, с чем я всё ещё воюю.

gag ★★★★★ ()
Ответ на: комментарий от Reset

А что мешает просто написать верхний слой на той же lua? Казалось бы все конфигурирование и управление пасется именно там...

AIv ★★★★★ ()
Ответ на: комментарий от AIv

Да, я не знаю луы

Когда я устроился на работу lua-кодером, я тоже не знал lua. В первый день спросил у тимлида, что почитать предварительно, он сказал, что lua - это не тот язык, про который _предварительно_ надо читать. Сказал открыть мануал и начинать кодить. И он оказался прав. Луа на среднем уровне изучается в процессе за пару часов.

DELIRIUM ☆☆☆☆☆ ()
Ответ на: комментарий от Reset

Затем же зачем встраивают lua в большие C++ приложения типа игр.

Я сильно подозреваю, что встраиваемый Lua используется для руления специальным API, который предоставляется игрой (т.е. для коллбеков по сути).

tailgunner ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.