Numpy не загружается через JNI

Я пытаюсь вызвать python из библиотеки JNI. Это работает, как и ожидалось, и благодаря всей информации в Интернете.

Моя проблема начинается, когда я пытаюсь «импортировать numpy как np». Когда я включаю это в любой скрипт Python, PyImport_Import(pName) в приведенном ниже коде возвращает значение null. Без проверки на ноль программа (как и ожидалось) выдает нарушение сегментации.

Я использую Java 7 (openjdk-amd64), Ubuntu 13.04, gcc 4.7.3.

Код ниже представляет собой фрагмент инициализации и вызова интерпретатора Python. Он компилируется в общий объект, загружаемый Java. Если тот же код включен в обычную программу, скрипт Python работает точно так, как ожидалось.

Я предполагаю, что numpy не может загружать требуемые библиотеки при запуске через java и общую библиотеку JNI. Но после 48 часов работы я понятия не имею, что мне нужно сказать ему, чтобы он заработал.

int call_python(char *module, char *function, PyObject *list)
{
PyObject *pName, *pModule, *pDict, *pFunc, *pValue;

Py_Initialize();
printf("Initialized\n");
pName = PyString_FromString(module);
printf("pName created from: '%s'\n", module);
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\".\")");
PyRun_SimpleString("sys.path.append(\"/home/jonathan/swigtests/j2p\")");
PyRun_SimpleString("print \"Interpreter Running\"");
pModule = PyImport_Import(pName);
if (pModule == (PyObject *)NULL)
{
    printf("Unable to load '%s'\n", module);
    return 0;
}
printf("Checking pmodule...%x\n", (int)pModule);
if (!PyModule_Check(pModule))
    printf("pModule is not a module!\n");
else
    printf("pModule is a module!\n");
pDict = PyModule_GetDict(pModule);
pFunc = PyDict_GetItemString(pDict, function);
PyObject *arglist = Py_BuildValue("(i)", 1); 
PyDict_SetItemString(pDict, "field", list);
if (PyCallable_Check(pFunc))
{
    printf("Calling Python\n");
    //if (PyObject_CallFunction(pFunc, "i", 2) == NULL)
    if (PyObject_CallObject(pFunc, arglist) == NULL)
        printf("CallFunction failed\n");
    else
        printf("CallFunction succeeded\n");
}
else
{
    printf("Not callable\n");
    PyErr_Print();
}
printf("Python done\n");
Py_DECREF(pModule);
Py_DECREF(pName);
Py_Finalize();
return 0;
}

Обновлять. Я добавил PyErr_Print после printf("Невозможно загрузить")... Это дает полезную распечатку трассировки:

Traceback (most recent call last):
  File "./py_function.py", line 3, in <module>
    import numpy as np
  File "/usr/lib/python2.7/dist-packages/numpy/__init__.py", line 137, in <module>
    import add_newdocs
  File "/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 9, in <module>
    from numpy.lib import add_newdoc
  File "/usr/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 4, in <module>
    from type_check import *
  File "/usr/lib/python2.7/dist-packages/numpy/lib/type_check.py", line 8, in <module>
    import numpy.core.numeric as _nx
  File "/usr/lib/python2.7/dist-packages/numpy/core/__init__.py", line 5, in <module>
    import multiarray
ImportError: /usr/lib/python2.7/dist-packages/numpy/core/multiarray.so: undefined symbol: PyExc_SystemError

Это начинает выглядеть как другая проблема, о которой сообщается с DateTime:

https://mail.python.org/pipermail//capi-sig/2013-August/000600.html

Точно такая же проблема:

Как разрешить импорт сторонних библиотек скриптами, вызываемыми во встроенном интерпретаторе Python?


person user2782711    schedule 16.09.2013    source источник