从C++转换到Python不久,就开始喜欢脚本语言了。虽然有人不喜欢把Python叫做脚本语言,但是脚本二字说明了它最擅长的领域是文本处理。用它的正则表达式+List+Dictionary处理文本,真的是得心应手。
在某些领域,C++还是有不可替代的优势。因此有时会需要把某些功能C++做成模块,再在Python里面调用,或者在C++里面调用Python,都可以结合两者的优势,相互取长补短。
我想最简单的还是Python调用windows dll。我喜欢dll,因为它独立,不用暴漏代码。当然它的缺点是平台依赖。
正文开始:
1. 创建windows dll
用VC创建一个windows dll的工程。添加需要导出的接口(函数)。这些函数可以供Python调用。
test.h
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
extern "C" TEST_API int fntest(void);
test.cpp
TEST_API int fntest(void)
{
return 42;
}
这里值得一提的是函数的定义要添加extern "C",以防止C++编译器的name mangling。如果不添加,Python会提示找不到函数定义。
2.Python里面调用windows dll导出的接口
test.py
import ctypes
dll = ctypes.windll.LoadLibrary( 'test.dll' )
test_result = ctypes.c_int(dll.fntest())
print(test_result.value)
相当的简单。值得一提的是,函数返回值在Python里面使用时,需要转换成ctypes模块里面定义的类型。例如,
test_result = ctypes.c_int(dll.fntest())