pythoncapi没有';t加载模块
我正在尝试使用C API加载一个python模块,该模块包含C中的数学和numpy导入。我可以加载并运行该模块,但如果导入数学模块,它将无法工作 我正在使用ArchLinux、Python2.7.2和gcc 代码如下:pythoncapi没有';t加载模块,python,c,python-c-api,python-embedding,Python,C,Python C Api,Python Embedding,我正在尝试使用C API加载一个python模块,该模块包含C中的数学和numpy导入。我可以加载并运行该模块,但如果导入数学模块,它将无法工作 我正在使用ArchLinux、Python2.7.2和gcc 代码如下: #include <stdio.h> #include <stdlib.h> #include <python2.7/Python.h> int main(int argc, char **argv) { PyObject *pNa
#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("pName\n");
return 0;
}
pModule = PyImport_Import(pName);
pDict = PyModule_GetDict(pModule);
pFunc = PyDict_GetItemString(pDict, "get_vals");
pArg = PyTuple_New(2);
PyTuple_SetItem(pArg, 0, 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;
}
我如何在不使用脚本的情况下将Python脚本移植到C?PySys\u SetPath(“.”清除了Python路径,因此它再也找不到任何库了。您真正需要做的是导入sys.path,然后将字符串附加到其中:
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));
(我没有测试上面的代码,但应该很接近。另外,你应该进行错误检查)在程序尝试加载模块后,我遇到了一个分段错误。。。现在我将尝试使用PyRun_SimpleString。我使用的是Python3.7,那里不存在来自String的
Pyring_。花了我一点时间,但我想有人会发现这很有用:使用PyUnicode\u FromString
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));