调用C函数的Python脚本,C函数调用Python函数

2024-04-25 01:41:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个普通的C用户,但对Python还很陌生。你知道吗

我有一个用C编写的库,用于执行我试图从Python脚本调用的计算。该库需要一些用户定义的例程,为此我尝试允许使用Python脚本。你知道吗

我遇到了一个问题,它向我表明我不了解一些非常基本的东西。下面是一个我无法运行的简单程序的代码。它应该将7(2+5)的结果打印到屏幕上。你知道吗

Python脚本测试.py被称为第一。它加载ctypes和库libfoo.so公司,并调用C例程c_do_work

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

print "Python 1: Going in..."
lib.c_do_work(2,5)

C函数c_do_work是在库中定义的libfoo.so公司,其中包含单模块test.c。此例程应运行Python脚本my_职能部门,它定义函数find_sum。Python解释器在此处初始化:

//gcc test.c -I/usr/include/python2.7/ -L/usr/lib/python2.7/ -lpython2.7 -lm -fPIC -c
//gcc -shared -Wl,-soname,libfoo.so -o libfoo.so  test.o
#include <Python.h>
#include <stdio.h>
#include <stdlib.h>

void c_do_work(int a,int b)
{
    Py_Initialize();

    PyObject* main_module = PyImport_AddModule("__main__");
    PyObject* main_dict = PyModule_GetDict(main_module);

    FILE* file_1 = fopen("my_func.py", "r");
    PyRun_File(file_1, "my_func.py",Py_file_input,main_dict, main_dict);
    PyObject* expression = PyDict_GetItemString(main_dict,"find_sum");

    printf("C: calling Python function...\n");
    PyObject_CallFunction(expression,"ii",a,b);

    //Clean up
    fclose(file_1);
    Py_Finalize();
}

最后,Python脚本_职能部门地址:

def find_sum(a, b):
    print a+b

当我运行“python测试.py“,我在C函数的第二行得到一个分段错误:

PyObject* main_module = PyImport_AddModule("__main__");

为什么会这样?如果我稍微重写C例程,使其成为main,并直接运行该程序,我就会得到所需的结果。问题似乎与Python解释器调用初始化Python解释器的例程有关。你知道吗


Tags: 函数py脚本so定义includemainlib