Python C API不加载模块
发布时间:2020-12-20 12:27:11 所属栏目:Python 来源:网络整理
导读:我正在尝试使用C API加载一个包含C中的数学和numpy导入的 python模块.我可以加载并运行模块但是,如果我导入数学模块它不起作用. 我使用的是Arch Linux,Python 2.7.2和gcc. 这里的代码: #include stdio.h#include stdlib.h#include python2.7/Python.hint ma
我正在尝试使用C API加载一个包含C中的数学和numpy导入的
python模块.我可以加载并运行模块但是,如果我导入数学模块它不起作用.
我使用的是Arch Linux,Python 2.7.2和gcc. 这里的代码: #include <stdio.h> #include <stdlib.h> #include <python2.7/Python.h> int main(int argc,char **argv) { PyObject *pName,*pModule,*pFunc,*pArg,*pDict,*pReturn,*pT1,*pT2,*pX,*pY; int i; double x,y; Py_Initialize(); PySys_SetPath("."); pName = PyString_FromString("func"); if (!pName) { printf("pNamen"); return 0; } pModule = PyImport_Import(pName); pDict = PyModule_GetDict(pModule); pFunc = PyDict_GetItemString(pDict,"get_vals"); pArg = PyTuple_New(2); PyTuple_SetItem(pArg,PyFloat_FromDouble(4.0)); PyTuple_SetItem(pArg,1,PyFloat_FromDouble(2.0)); pReturn = PyObject_CallObject(pFunc,pArg); pT1 = PyTuple_GetItem(pReturn,0); pT2 = PyTuple_GetItem(pReturn,1); for (i = 0; i < PyTuple_Size(pT1); i++) { pX = PyTuple_GetItem(pT1,i); pY = PyTuple_GetItem(pT2,i); x = PyFloat_AsDouble(pX); y = PyFloat_AsDouble(pY); Py_XDECREF(pX); Py_XDECREF(pY); pX = NULL; pY = NULL; printf("Point p position is: %.2fx,%.2fy",x,y); } Py_XDECREF(pName); Py_XDECREF(pModule); Py_XDECREF(pFunc); Py_XDECREF(pArg); Py_XDECREF(pDict); Py_XDECREF(pReturn); Py_XDECREF(pT1); Py_XDECREF(pT2); Py_Finalize(); return 0; } func.py from math import cos def get_vals(width,height): x = (1,2) y = (cos(3),4) return x,y 如何在不需要使用脚本的情况下将Python脚本嵌入到C中? 解决方法
PySys_SetPath(“.”)清除了python路径,因此无法再找到任何库.你真正需要做的是导入sys.path然后将你的字符串附加到它:
PyObject *sys = PyImport_ImportModule("sys"); PyObject *path = PyObject_GetAttrString(sys,"path"); PyList_Append(path,PyString_FromString(".")); (我没有测试上面的代码,但应该关闭.另外,你应该做错误检查) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |