Я пытаюсь встроить 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)
Я думаю, что вы статически связываете, но не сохраняете все символы, которые требуются для загрузки модулей динамического расширения (т.е. -Xlinker -export-dynamic
). Увидеть Требования к связыванию, который рекомендует вам запросить правильные параметры из distutils.sysconfig.get_config_var('LINKFORSHARED')
,
Кстати, переменная функция Py_BuildValue
это более удобный способ создания args
,
Я знаю, что этот ответ приходит поздно, но может помочь другим, борющимся с той же проблемой.
Исправление, которое помогло мне, состояло в том, чтобы удостовериться, что 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.