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

#c #linux #python-3.x #cython #python-embedding

#c #linux #python-3.x #cython #python-встраивание

Вопрос:

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

Моя проблема в том, что я получаю ошибку сегментации при запуске 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 вызывает мои проблемы, но результат был полностью тем же.

Комментарии:

1. PyInit_helloworld возвращает ошибку PyObject* или NULL при. Добавление проверки для этого может иметь смысл (вероятно, нет, но возможно)

2. Не удается воспроизвести, пример выполняется для меня корректно. Если у вас установлена Anaconda в каталоге вашего пользователя, попробуйте удалить ее из LD_LIBRARY_PATH.