c中调用python

最近研究了在c中调用python,中间碰到了一些困难,不过还好,已经解决了。

首先是c的代码,我保存为try.c:

#include <Python.h>

int
main(int argc, char *argv[])
{
Py_Initialize();
PyRun_SimpleString("from pytest import add\n"
       "add(4,5)\n");
Py_Finalize();
return 0;
}

先不要编译,看看里面有一个函数,为PyRun_SimpleString,这个可以把简单的python嵌入到c中,如果你懂python,就应该明白,我导入了一个名为pytest的模块,下面是pytest.py中的内容:

def add(a,b):
    print "in python function add"
    print "a = " + str(a)
    print "b = " + str(b)
    print "ret = " + str(a+b)
    return a + b

把pytest.py和前面的try.c放到同一目录下,接下来就是编译了,我是在windows下使用gfortran,所以在命令提示符下输入:

>gfortran try.c -Ic:\python26\include -c -o try.o

>gfortran try.o -Lc:\python26\libs -lpython26 -o try

这样就可以了,生成的为try.exe。注意此处,第一条里的-I是大写的i,而第二条是小写的l。

还要注意,在程序中,用到了Python代码的前面,应该进行初始化,就是Py_Initialize(),用完之后要Py_Finalize()。

这是另一个程序,里面没有调用外部的python程序。比如名为try2.c

#include "Python.h"

long
sum_list(PyObject *list)
{
    int i, n;
    long total = 0;
    PyObject *item;    n = PyList_Size(list);
    if (n < 0)
        return -1; /* Not a list */
    for (i = 0; i < n; i++) {
        item = PyList_GetItem(list, i); /* Can't fail */
        if (!PyInt_Check(item)) continue; /* Skip non-integers */
        total += PyInt_AsLong(item);
    }
    return total;
}
int main()
{
Py_Initialize();
PyObject *list;
long result;
list=PyList_New(4);
PyList_SetItem(list,0,PyInt_FromLong(1L));
PyList_SetItem(list,1,PyInt_FromLong(2L));
PyList_SetItem(list,2,PyInt_FromLong(3L));
PyList_SetItem(list,3,PyInt_FromLong(4L));
result=sum_list(list);
printf("%d\n",result);
Py_Finalize();
return 0;
}

同样,可以进行编译了,我们可以将编译链接写一起,

>gfortran try2.c -Ic:\python26\include -Lc:\python26\libs -lpython26 -o try2

如果大家不是用gfortran,可以用其他编译器,但要注意,要添加头文件和库文件,路径就是我上面命令中出现的。其实我原来用gcc的,后来无意发现gfortran也可以,就懒得改了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值