在中嵌入python时Numpy导入失败

2024-09-30 06:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在c++代码中嵌入一个python程序。我遇到的问题是使用包含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;
}

包括以下内容日志.py包含函数derive的脚本

^{pr2}$

它运行正常,但是如果日志.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)

Tags: 代码numpydtresultxppyobjectdoublechar
2条回答

我知道这个答案来得很晚,但可能会帮助其他人解决同样的问题。在

帮助我的修复是确保python链接了正确的DLL和库,因为当安装了python的多个版本时,python可以将它们混合在一起。在

确保运行PyRun_SimpleString("import sys")PyRun_SimpleString("print sys.path"),查看结果。如果其中包含Python的多个版本,则需要强制选择正确的路径。在

启动Python.exe您知道的是正确的版本(也就是说,在编译期间安装了实际的numpy包链接)和:import sys,然后是print sys.path。将此路径复制到C/C++文件内的:^ {< CD5> }。现在应该强制DLL的正确路径,并且导入numpy不会导致segfault。在

我认为您是静态链接,但没有保留所有符号,这是加载动态扩展模块(即-Xlinker -export-dynamic)所必需的。请参见Linking Requirements,它建议您从distutils.sysconfig.get_config_var('LINKFORSHARED')查询正确的选项。在

顺便说一句,变量函数^{}是创建args的一种更方便的方法。在

相关问题 更多 >

    热门问题