PyImport_Import seg.ошибки после вызова C, который вызывает Python, из Python - PullRequest
0 голосов
/ 22 ноября 2018

Я вызываю код Python внутри функции C, и она работает нормально.Тем не менее, я хотел вызвать функцию C из Python (эффективно повторно использовать весь код C), но когда дело доходит до импорта модулей Python из CI, получается сег.ошибка

(убрана вся проверка ошибок из кода, чтобы сделать это проще)

main.c:

#include "Python.h"

int runpython() {
    Py_Initialize();
    PyObject* pFunc;
    PyObject *pArgs;
    PyObject *pValue;
    PyObject* pName = PyString_FromString("python_module");
    PyObject* pModule = PyImport_Import(pName);
    Py_DECREF(pModule);

    pFunc = PyObject_GetAttrString(pModule, "pcall");
    pArgs = PyTuple_New(1);
    pValue = PyInt_FromLong(42);
    PyTuple_SetItem(pArgs, 0, pValue);
    pValue = PyObject_CallObject(pFunc, pArgs);
    Py_DECREF(pArgs);
    Py_DECREF(pValue);
    Py_XDECREF(pFunc);
    Py_DECREF(pModule);
}

int main() {
    return runpython();
}

python_module.py

def pcall(value):
    print "Value: " + str(value)

python_main.py

from ctypes import *

cdll.LoadLibrary("libMyPython.so")
libc = CDLL("libMyPython.so") 
libc.runpython()

среда и выполнение:

export PYTHONPATH=$PYTHONPATH:$PWD
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD

echo "Running C main"
gcc main.c -o main -I/usr/include/python2.7 -lpython2.7 -g
./main

echo "Running Python main"
gcc -shared -fPIC main.c -o libMyPython.so -I/usr/include/python2.7 -lpython2.7 -g
python python_main.py

Пример вывода:

### Running C main
Value: 42
### Running Python main
Segmentation fault      (core dumped)

Запуск в GDB приводит к стеку:

Program received signal SIGSEGV, Segmentation fault.
0x00005555556318d9 in PyImport_Import ()
(gdb) bt
#0  0x00005555556318d9 in PyImport_Import ()
#1  0x00007ffff5e07883 in runpython () at c_main.c:9
#2  0x00007ffff600edae in ffi_call_unix64 () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#3  0x00007ffff600e71f in ffi_call () from /usr/lib/x86_64-linux-gnu/libffi.so.6
#4  0x00007ffff6221e56 in _ctypes_callproc ()
   from /usr/lib/python2.7/lib-dynload/_ctypes.x86_64-linux-gnu.so
#5  0x00007ffff6221505 in ?? () from /usr/lib/python2.7/lib-dynload/_ctypes.x86_64-linux-gnu.so
#6  0x000055555564f420 in PyEval_EvalFrameEx ()
#7  0x0000555555647d0a in PyEval_EvalCodeEx ()
#8  0x0000555555647629 in PyEval_EvalCode ()
#9  0x000055555567861f in ?? ()
#10 0x0000555555673322 in PyRun_FileExFlags ()
#11 0x000055555567267d in PyRun_SimpleFileExFlags ()
#12 0x00005555556211ab in Py_Main ()
#13 0x00007ffff7a05b97 in __libc_start_main (main=0x555555620b10 <main>, argc=2, 
    argv=0x7fffffffde58, init=<optimised out>, fini=<optimised out>, rtld_fini=<optimised out>, 
    stack_end=0x7fffffffde48) at ../csu/libc-start.c:310
#14 0x0000555555620a2a in _start ()

Я пытался использовать PyImport_ImportModule или PyRun_SimpleString("import python_module") с теми же эффектами ... Есть идеи?

Я запускаю это на машине с Ubuntu, используя python2.7.

...