標籤:
在網上搜了下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.pathimport 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
使用Visual Studio,幾步實現Python C++擴充,以及DLL調用