Python C API 不加载模块

标签 python c python-c-api python-embedding

我正在尝试使用 C API 加载一个包含数学和 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("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;
}

函数.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("."));

(我没有测试上面的代码,但应该很接近。另外,你应该做错误检查)

关于Python C API 不加载模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7624529/

相关文章:

Python while/if 循环忽略条件

python - 二维数组的 numpy in1d 实现?

C编程,通过udp发送wav文件

python - native 扩展可以支持多个模块吗?

python - 如何从指向字符串的 PyObject 获取 char*

python - 如何使用FOR循环通过django模板中的列表获取值?

python - Python 中的 QuickSort - 程序挂起较大的输入大小?

c - 使用 C 开发备份程序

c - 将文件保存到结构中

python - 将 PyArrayObject 数据类型转换为 C 数组