【问题标题】:Numpy import fails when embedding python in c在 c 中嵌入 python 时,numpy 导入失败
【发布时间】:2012-11-13 19:16:59
【问题描述】:

我正在尝试将 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;
}

使用以下包含函数derive的log.py脚本

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)

【问题讨论】:

    标签: c++ python numpy embed


    【解决方案1】:

    我知道这个答案来晚了,但可能会帮助其他人在同样的问题上苦苦挣扎。

    对我有帮助的解决方法是确保 python 链接了正确的 DLL 和库,因为 Python 可以在安装多个版本的 Python 时混合使用这些。

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

    启动您知道是正确版本的 Python.exe,(即,您在编译期间安装了实际 numpy 包链接的位置)和:import sys,然后是 @987654324 @。将此路径复制到:C/C++ 文件中的PyRun_SimpleString("sys.path = [your paths]");。现在应该强制 DLL 的正确路径,并且导入 numpy 不会导致段错误。

    【讨论】:

      【解决方案2】:

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

      顺便说一句,可变参数函数Py_BuildValue 是创建args 的更方便的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-11
        • 2020-04-14
        • 2021-03-29
        • 1970-01-01
        • 2015-08-13
        • 1970-01-01
        • 1970-01-01
        • 2016-10-29
        相关资源
        最近更新 更多