Не удается импортировать Numpy при встраивании Python в C

Я пытаюсь встроить Python-программу в код C ++. проблема, которую я имею, состоит в том, чтобы использовать сценарий python, который содержит импорт numpy.
например, если я использую следующий код C ++

#include <Python.h>
int main(int argc,char *argv[])
{
double
x=2.,
xp=4.,
dt=6.,
y=8,
yp=1,
dz=6;
Py_Initialize();

PyObject* myModuleString = PyString_FromString((char*)"log");
PyObject* myModule = PyImport_Import(myModuleString);PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"derive");
PyObject* args = PyTuple_Pack(  6,
PyFloat_FromDouble(x),
PyFloat_FromDouble(xp),
PyFloat_FromDouble(dt),
PyFloat_FromDouble(y),
PyFloat_FromDouble(yp),
PyFloat_FromDouble(dz));

PyObject* myResult = PyObject_CallObject(myFunction, args);

PyObject *ts= PyTuple_GetItem(myResult,0);
PyObject *zs= PyTuple_GetItem(myResult,1);
double result_t = PyFloat_AsDouble(ts);
double result_z = PyFloat_AsDouble(zs);
printf("%3f \n %f \n", result_t,result_z);

Py_Finalize();

system("pause");

return 0;
}

со следующим скриптом log.py, который содержит функцию derive

def derive(x,xp,dt,y,yp,dz):
return log(abs(x - xp)/dt),exp((y-yp)/dz)

он работает правильно, но если log.py содержит from numpy import arrayне получается

from numpy import array
def derive(x,xp,dt,y,yp,dz):
return log(abs(x - xp)/dt),exp((y-yp)/dz)

6

Решение

Я думаю, что вы статически связываете, но не сохраняете все символы, которые требуются для загрузки модулей динамического расширения (т.е. -Xlinker -export-dynamic). Увидеть Требования к связыванию, который рекомендует вам запросить правильные параметры из distutils.sysconfig.get_config_var('LINKFORSHARED'),

Кстати, переменная функция Py_BuildValue это более удобный способ создания args,

2

Другие решения

Я знаю, что этот ответ приходит поздно, но может помочь другим, борющимся с той же проблемой.

Исправление, которое помогло мне, состояло в том, чтобы удостовериться, что python связал правильные библиотеки DLL и библиотеки, так как Python может смешивать их, когда установлено несколько версий Python.

Убедитесь, что вы бежите PyRun_SimpleString("import sys") а такжеPyRun_SimpleString("print sys.path") посмотрите на результаты. Если он содержит несколько версий Python, вам нужно указать правильный путь.

Запустите Python.exe, который, как вы знаете, является правильной версией (то есть там, где вы установили фактический пакет numpy). а также ссылка на во время компиляции) и: import sys, затем print sys.path, Скопируйте этот путь к: PyRun_SimpleString("sys.path = [your paths]"); в вашем файле C / C ++. Теперь необходимо ввести правильный путь к DLL, и импорт numpy не должен приводить к segfault.

0

По вопросам рекламы [email protected]