c语言调用python

首先编写一个python脚本,命名为pytest.py;

1 def add(a,b):
2     print "in python function add"
3     return a+b

c调用python示例:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 //#include "C:/Python27/include/python.h"
 4 //#pragma comment(lib, "C:\\Python27\\libs\\python27.lib") 
 5 //若在编译器设置了include和lib路径以上两行可以转化为
 6 #include<Python.h>
 7 int main(char argc,char **argv)
 8 {
 9 //初始化Python
10 //在使用Python系统前,必须使用Py_Initialize对其进行初始化。
11 //它会载入Python的内建模块并添加系统路径到模块搜索路径中。
12     PyObject *pName,*pModule,*pDict,*pFunc,*pArgs,*pRetVal;
13     Py_Initialize();
14     if(!Py_IsInitialized())
15     {
16         return -1;
17     }
18 //载入名为pytest的脚本,(注意:不是pytest.py)    
19     pName = PyString_FromString("pytest"); 
20     pModule = PyImport_Import(pName);
21     if(!pModule)
22     {
23         printf("can't find pytest.py");
24         getchar();
25         return -1;
26     }
27     pDict = PyModule_GetDict(pModule);
28     if(!pDict)
29     {
30         return -1;
31     }
32 //找出函数名为add的函数
33     pFunc = PyDict_GetItemString(pDict,"add");
34     if(!pFunc || !PyCallable_Check(pFunc))
35     {
36         printf("can't find function [add]");
37         getchar();
38         return -1;
39     }
40 //参数进栈
41     pArgs = PyTuple_New(2);
42 //下面的是重点了,从c/c++传参数到Python中时需要用到一个函数,原型为
43 //PyObject* Py_BuildValue(char *format,……)
44 //类似c的printf,但格式不同。常见的格式有
45 //s 字符串
46 //i 整形变量
47 //f 浮点型
48 //o Python对象
49     PyTuple_SetItem(pArgs,0,Py_BuildValue("l",3));
50     PyTuple_SetItem(pArgs,1,Py_BuildValue("l",4));
51 //调用Python函数
52     pRetVal = PyObject_CallObject(pFunc,pArgs);
53     printf("function return value: %ld\r\n",PyInt_AsLong(pRetVal));
54     Py_DECREF(pName);  
55     Py_DECREF(pArgs);  
56     Py_DECREF(pModule);  
57     Py_DECREF(pRetVal);  
58 // 关闭Python  
59     Py_Finalize();  
60     return 0;  
61 }

编译运行出错:

  加了include和lib还是链接出错,比如 canno open file "python27.lib",直接在工程->设置->链接上加上python27.lib

"s" (string) [char *] :将C字符串转换成Python对象,如果C字符串为空,返回NONE。
"s#" (string) [char *, int] :将C字符串和它的长度转换成Python对象,如果C字符串为空指针,长度忽略,返回NONE。
"z" (string or None) [char *] :作用同"s"。
"z#" (string or None) [char *, int] :作用同"s#"。
"i" (integer) [int] :将一个C类型的int转换成Python int对象。
"b" (integer) [char] :作用同"i"。
"h" (integer) [short int] :作用同"i"。
"l" (integer) [long int] :将C类型的long转换成Pyhon中的int对象。
"c" (string of length 1) [char] :将C类型的char转换成长度为1的Python字符串对象。
"d" (float) [double] :将C类型的double转换成python中的浮点型对象。
"f" (float) [float] :作用同"d"。
"O&" (object) [converter, anything] :将任何数据类型通过转换函数转换成Python对象,这些数据作为转换函数的参数被调用并且返回一个新的Python对象,如果发生错误返回NULL。
"(items)" (tuple) [matching-items] :将一系列的C值转换成Python元组。
"[items]" (list) [matching-items] :将一系列的C值转换成Python列表。
"{items}" (dictionary) [matching-items] :将一系类的C值转换成Python的字典,每一对连续的C值将转换成一个键值对。
例如:
Py_BuildValue("") None
Py_BuildValue("i", 123) 123
Py_BuildValue("iii", 123, 456, 789) (123, 456, 789)
Py_BuildValue("s", "hello") 'hello'
Py_BuildValue("ss", "hello", "world") ('hello', 'world')
Py_BuildValue("s#", "hello", 4) 'hell'
Py_BuildValue("()") ()
Py_BuildValue("(i)", 123) (123,)
Py_BuildValue("(ii)", 123, 456) (123, 456)
Py_BuildValue("(i,i)", 123, 456) (123, 456)
Py_BuildValue("[i,i]", 123, 456) [123, 456]Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) {'abc': 123, 'def': 456}
Py_BuildValue("((ii)(ii)) (ii)", 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))
posted @ 2014-04-09 08:38  _level_  阅读(2112)  评论(0编辑  收藏  举报