Использование С/С++ в Python

290 просмотра
0

Доброго времени, суток. Мне надо надо написать функцию которую можно будет вызывать в Python 3.5, для этого я решил использовать Python C/C++ API, проблема в том что я ни как не могу понять как заставить его работать, так как ни в одном туториале нету того что исправило бы мои ошибки, либо я совсем тупой и в упор этого не вижу.

CMakeList.txt

cmake_minimum_required(VERSION 3.10)
project(bufr_drawer)
 
set(CMAKE_CXX_STANDARD 11)
 
add_executable(bufr_drawer main.cpp)
 
find_package(PythonLibs REQUIRED)
include_directories(/usr/include/python3.5)

Пример кода

#include <iostream>
#include <Python.h>
 
int main(int argc, char *argv[]) {
PyObject *pName, *pModule, *pDict, *pFunc, *pValue;
 
if (argc < 3)
{
    printf("Usage: exe_name python_source function_name\n");
    return 1;
}
 
// Инициализировать интерпретатор Python
Py_Initialize();
 
// Построить объект имени
pName = PyBytes_FromString(argv[1]);
 
// Загрузить объект модуля
pModule = PyImport_Import(pName);
 
// pDict – заимствованная ссылка
pDict = PyModule_GetDict(pModule);
 
// pFunc – тоже заимствованная ссылка
pFunc = PyDict_GetItemString(pDict, argv[2]);
 
if (PyCallable_Check(pFunc))
{
    PyObject_CallObject(pFunc, NULL);
} else
{
    PyErr_Print();
}
 
// Вернуть ресурсы системе
Py_DECREF(pModule);
Py_DECREF(pName);
 
// Завершить интерпретатор Python
Py_Finalize();
 
 
return 0;
}

Ошибки

/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate    /apps/bufr_image/bufr_drawer/main.cpp:14: undefined reference to `Py_Initialize'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:17: undefined reference to `PyBytes_FromString'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:20: undefined reference to `PyImport_Import'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:23: undefined reference to `PyModule_GetDict'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:26: undefined reference to `PyDict_GetItemString'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:28: undefined reference to `PyCallable_Check'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:30: undefined reference to `PyObject_CallObject'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:33: undefined reference to `PyErr_Print'
/home/divinitytoffee/projects/ice-platform-git/Platform/iceserver/icegate/apps/bufr_image/bufr_drawer/main.cpp:41: undefined reference to `Py_Finalize'

В случае других функций приведённых в примерах он просто говорит что их не существует. Собственно просьба в том что бы мне объяснили где я не прав и как это исправить.


Добавить комментарий

1 Ответы

Python Опубликовано 12.12.2018
0

Как минимум добавь в CMakeLists.txt:

target_link_libraries ( bufr_drawer ${PYTHON_LIBRARIES} )
include_directories ( ${PYTHON_INCLUDE_DIRS} )

Но так ты только соберёшь исполняемый файл в который будет использовать питона… Чтобы собрать питоновский подуль из которого можно будет вызывать Си-код нужно нечто сильно другое…

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up