使用Visual Studio,幾步實現Python C++擴充,以及DLL調用

來源:互聯網
上載者:User

標籤:

在網上搜了下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調用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.