Ошибка сегментации при попытке встроить модуль Python в приложение C / C ++. Требуется помощь новичку - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь создать простой пример «Hello world», который встраивает функцию Python / Cython в приложение, написанное на C. Я хочу также встроить интерпретатор Python, чтобы приложение не имело внешнихзависимость.Это часть более крупного проекта по использованию кода Python в приложении C / C ++, но я хотел сначала создать простой пример, чтобы изучить основы.Конечное приложение называется demo, и оно просто вызывает функцию с именем helloworld, которая написана на Cython.Функция helloworld просто выводит "Hello world!"(очевидно ...).

Моя проблема в том, что я получаю ошибку сегментации при запуске исполняемого файла demo.

Мой пример основан в основном на этом руководстве.Мне пришлось немного изменить пример, так как он не компилировался (то есть команда cython выдавала ошибку) с первого раза.Вот полный код и набор команд, которые я выполнил:

helloworld.pyx

cdef public void helloworld():
   print("Hello world!")

demo.c

#include <Python.h>
#include "helloworld.h"

int main () {

   Py_Initialize ();
   PyInit_helloworld ();

   // Call the Cython function
   helloworld ();

   Py_Finalize ();
   return 0;
}

Команды, используемые для компиляции:

$ cython -3 helloworld.pyx
$ gcc -g -fpic -c helloworld.c -o helloworld.o `python3.6-config --includes`
$ gcc -g -fpic -c demo.c -o demo.o `python3.6-config --includes`
$ gcc -g -o demo helloworld.o demo.o `python3.6-config --libs` -L /home/rob/anaconda3/lib

Однако при запуске demo я получаю следующее:

$ ./demo
Segmentation fault (core dumped)

Копаем немного глубже:

$ gdb demo
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
[output truncated]
(gdb) r
Starting program: /home/rob/cython_test/demo 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00005555555569cb in __Pyx_PyObject_Call (func=0x0, arg=0x0, kw=0x0) at helloworld.c:1493
warning: Source file is more recent than executable.
1493        ternaryfunc call = func->ob_type->tp_call;

В случае, если это уместно, здесьвывод команд python3.6-config, встроенных в флаги gcc:

$ python3.6-config --includes
-I/home/rob/anaconda3/include/python3.6m -I/home/rob/anaconda3/include/python3.6m
$ python3.6-config --libs
-lpython3.6m -lpthread -ldl  -lutil -lrt -lm 

Я также попытался скомпилировать вышесказанное с помощью "системной" установки Python, поскольку я немного подозревал, чтоРаспространение Anaconda вызывало мои проблемы, но результат был полностью таким же.

...