我正在尝试将python程序嵌入到c ++代码中。我遇到的问题是使用包含numpy导入的python脚本。 例如,如果我使用以下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)
答案 0 :(得分:2)
我认为您是静态链接但未保留加载动态扩展模块(即-Xlinker -export-dynamic
)所需的所有符号。请参阅Linking Requirements,建议您从distutils.sysconfig.get_config_var('LINKFORSHARED')
查询正确的选项。
顺便说一句,变量函数Py_BuildValue
是创建args
的更方便的方法。
答案 1 :(得分:0)
我知道这个答案来晚了,但可能会帮助其他在同一问题上苦苦挣扎的人。
对我有帮助的修补程序是确保python链接了正确的DLL和库,因为在安装多个版本的Python时Python可以将它们混合在一起。
确保运行PyRun_SimpleString("import sys")
和PyRun_SimpleString("print sys.path")
,然后查看结果。如果其中包含多个版本的Python,则需要强制使用正确的路径。
启动您知道正确版本的Python.exe(即在编译过程中安装了实际的numpy软件包和链接的位置),然后:import sys
,然后print sys.path
。将此路径复制到C / C ++文件中的PyRun_SimpleString("sys.path = [your paths]");
。现在,应该强制使用DLL的正确路径,并且导入numpy不会导致segfault。