加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(我没有测试上面的代码,但应该关闭.另外,你应该做错误检查)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读