在网上搜了下Python扩展教程,很多提到第三方开源库,而官方推荐的是用setup.py。其实用Visual Studio很简单!来看一下如何一步步编写一个Python扩展,以及如何通过扩展来调用DLL。
参考原文:Wrapping C/C++ Methods of Dynamsoft Barcode SDK for Python
Visual Studio环境配置
在Visual Studio中创建一个Win32工程DynamsoftBarcodeReader。打开工程属性,添加头文件和库文件路径:
添加依赖库python27.lib:
把扩展改成.pyd:
这样就可以去build工程了。不过如果是使用Debug去build,会出现错误:
原因是因为官方发布的python安装包不包涵debug的库,如果需要可以自己下载源码编译。所以把配置切换到release,成功生成DynamsoftBarcodeReader.pyd:
DLL调用举例:封装Dynamsoft Barcode SDK C++接口
在Python脚本中导入DynamsoftBarcodeReader,Python会搜索DynamsoftBarcodeReader.pyd,并且调用initDynamsoftBarcodeReader()做初始化。
在工程配置中先加入Dynamsoft Barcode SDK的头文件和库路径,然后使用下面的代码调用Barcode解码,并把结果转换成Python数据:
static PyObject * decodeFile(PyObject *self, PyObject *args) { char *pFileName; int option_iMaxBarcodesNumPerPage = -1; int option_llBarcodeFormat = -1; if (!PyArg_ParseTuple(args, "s", &pFileName)) { return NULL; } pBarcodeResultArray pResults = NULL; ReaderOptions option; SetOptions(&option, option_iMaxBarcodesNumPerPage, option_llBarcodeFormat); int ret = DBR_DecodeFile( pFileName, &option, &pResults ); if (ret == DBR_OK){ int count = pResults->iBarcodeCount; pBarcodeResult* ppBarcodes = pResults->ppBarcodes; pBarcodeResult tmp = NULL; PyObject* list = PyList_New(count); PyObject* result = NULL; for (int i = 0; i < count; i++) { tmp = ppBarcodes[i]; result = PyString_FromString(tmp->pBarcodeData); PyList_SetItem(list, i, Py_BuildValue("iN", (int)tmp->llFormat, result)); } // release memory DBR_FreeBarcodeResults(&pResults); return list; } return Py_None; } static PyMethodDef methods[] = { { "initLicense", initLicense, METH_VARARGS, NULL }, { "decodeFile", decodeFile, METH_VARARGS, NULL }, { NULL, NULL } };
在工程配置中加入DLL自动拷贝,在编译之后就可以把DLL拷贝到release目录中了:
编译工程生成DynamsoftBarcodeReader.pyd。
在release目录中新建一个Python脚本:
一个简单的Python Barcode Reader代码如下:
import os.path import DynamsoftBarcodeReader formats = { 0x1FFL : "OneD", 0x1L : "CODE_39", 0x2L : "CODE_128", 0x4L : "CODE_93", 0x8L : "CODABAR", 0x10L : "ITF", 0x20L : "EAN_13", 0x40L : "EAN_8", 0x80L : "UPC_A", 0x100L : "UPC_E", } def initLicense(license): DynamsoftBarcodeReader.initLicense(license) def decodeFile(fileName): results = DynamsoftBarcodeReader.decodeFile(fileName) for result in results: print "barcode format: " + formats[result[0]] print "barcode value: " + result[1] if __name__ == "__main__": barcode_image = input("Enter the barcode file: "); if not os.path.isfile(barcode_image): print "It is not a valid file." else: decodeFile(barcode_image);
用Barcode图片测试一下:
源码
https://github.com/Dynamsoft/Dynamsoft-Barcode-Reader/tree/master/samples/Python