Python与C集成
作者:张元礼
近期为了研究一个新的测试工具,需要Python与C集成交互,为此特对Python进行初步的研究和查阅相关资料,得出一个初步的研究成果,供大家分享交流。
一、 软件安装
1、 Python-2.3.3.exe(注意:版本有关系,有些高版本有问题)
2、 VC 6.0
二、运行环境配置
1、本文默认Python的安装目录为:C:/Python23;在VC IDE中Tools->Options->Directories配置Include files为:C:/Python23/include;Library files为:C:/Python23/libs;
2、如需要Debug版本的要下载python23_d.lib和python23_d.dll这两个文件,也可以下载Python源码来编译获得,具体可查阅相应文档。
三、C调用Python
1、Test.c源码
// 检查初始化是否成功
if ( !Py_IsInitialized() )
{
return -1;
}
//添加当前路径
//把输入的字符串作为Python代码直接运行,返回0
//表示成功,-1表示有错。大多时候错误都是因为字符串
//中有语法错误。
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
// 载入名为pytest的脚本
pName = PyString_FromString("pytest");
pModule = PyImport_Import(pName);
if ( !pModule )
{
printf("can't find pytest.py");
getchar();
return -1;
}
pDict = PyModule_GetDict(pModule);
if ( !pDict )
{
return -1;
}
// 找出函数名为add的函数
pFunc = PyDict_GetItemString(pDict, "vcadd");
if ( !pFunc || !PyCallable_Check(pFunc) )
{
printf("can't find function [vcadd]");
getchar();
return -1;
}
// 参数进栈
*pArgs;
pArgs = PyTuple_New(2);
// PyObject* Py_BuildValue(char *format, ...)
// 把C++的变量转换成一个Python对象。当需要从
// C++传递变量到Python时,就会使用这个函数。此函数
// 有点类似C的printf,但格式不同。常用的格式有
// s 表示字符串,
// i 表示整型变量,
// f 表示浮点数,
// O 表示一个Python对象。
PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",3));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("l",4));
// 调用Python函数
PyObject_CallObject(pFunc, pArgs);
//下面这段是查找函数foo 并执行foo
pFunc = PyDict_GetItemString(pDict, "vcfoo");
if ( !pFunc || !PyCallable_Check(pFunc) )
{
printf("can't find function [vcfoo]");
getchar();
return -1;
}
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("l",2)); //
PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pName);
Py_DECREF(pArgs);
Py_DECREF(pModule);
// 关闭Python
Py_Finalize();
return 0;
}
2、 pytest.py源码
3、运行设置
将pytest.py文件与C工程编译的exe文件存放同一目录下(具体的存放路径应该可以统一配置,在此不便描述),启动编译的exe文件后即可调用pytest.py文件的函数及执行结果。
四、Python调用C
1、建立一个目录,整个目录名中不要包含中文。在目录下建立 add.c,内容如下:
然后建立setup.py这个文件,内容如下:
在msdos下进入这个目录,输入命令setup.py build。 如果你能编译成功,到你所在目录的build/lib.win32-2.3下会发现add.pyd文件,将文件复制到你所需要的地方(与python同目录下,放在其他目录的话要配置环境变量),启动python,然后:
2、C源码
static PyMethodDef addMethods[] =
{
{"add", add, METH_VARARGS, "Execute a shell command,Create by Vince."},
{NULL, NULL, 0, NULL}
}
PyMODINIT_FUNC initvince()
{
Py_InitModule("vince", addMethods);
}
3、 setup.py
欢迎转载此文,转载时请注明文章来源:张元礼的博客 http://blog.csdn.net/vincetest