最近研究了在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也可以,就懒得改了。