Numpy 无法通过 JNI 加载

问题描述 投票:0回答:1

我正在尝试从 JNI 库调用 python。这按预期工作,并且感谢互联网上的所有信息。

当我尝试“将 numpy 导入为 np”时,我的问题开始了。当我将其包含在任何 python 脚本中时,下面代码中的 PyImport_Import(pName) 返回 null。如果不检查 null,程序(预期)会发出分段违规。

我正在使用Java 7(openjdk-amd64),Ubuntu 13.04,gcc 4.7.3

下面的代码是Python解释器初始化和调用的片段。它被编译成Java加载的共享对象。如果普通程序中包含相同的代码,则 python 脚本将完全按预期运行。

我的猜测是,当通过 java 和共享 JNI 库运行时,numpy 无法加载所需的库。但经过 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;
}

更新。我在 printf("Unable to load") 之后添加了 PyErr_Print...这会产生有用的回溯打印输出:

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解释器中调用的脚本导入第3方库?

numpy java-native-interface undefined-symbol
1个回答
0
投票

您可以使用JEP。 GH:https://github.com/ninia/jep JavaDoc:https://ninia.github.io/jep/javadoc/4.2/

您将能够执行您的java代码。

但是你会收到警告: ” 用户警告:NumPy 是从 Python 子解释器导入的,但 NumPy 无法正确支持子解释器。这可能适用于大多数用户,但可能会导致难以追踪问题或细微的错误。罕见的子解释器功能的一个常见用户是 wsgi,它也允许单解释器模式。 欢迎对错误进行改进,但这不在 NumPy 路线图上,并且可能需要付出巨大的努力才能实现全面支持。 将 numpy 导入为 np ”

© www.soinside.com 2019 - 2024. All rights reserved.