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

在網上搜了下Python擴展教程,不少提到第三方開源庫,而官方推薦的是用setup.py。其實用Visual Studio很簡單!來看一下如何一步步編寫一個Python擴展,以及如何經過擴展來調用DLL。 html

參考原文:Wrapping C/C++ Methods of Dynamsoft Barcode SDK for Python python

Visual Studio環境配置

在Visual Studio中建立一個Win32工程DynamsoftBarcodeReader。打開工程屬性,添加頭文件和庫文件路徑:
git

添加依賴庫python27.lib
github

把擴展改爲.pyd
app

這樣就能夠去build工程了。不過若是是使用Debug去build,會出現錯誤:
測試

緣由是由於官方發佈的python安裝包不包涵debug的庫,若是須要能夠本身下載源碼編譯。因此把配置切換到release,成功生成DynamsoftBarcodeReader.pyd
ui

DLL調用舉例:封裝Dynamsoft Barcode SDK C++接口

在Python腳本中導入DynamsoftBarcodeReader,Python會搜索DynamsoftBarcodeReader.pyd,而且調用initDynamsoftBarcodeReader()作初始化。
spa

在工程配置中先加入Dynamsoft Barcode SDK的頭文件和庫路徑,而後使用下面的代碼調用Barcode解碼,並把結果轉換成Python數據: debug

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目錄中了:
code

編譯工程生成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

相關文章
相關標籤/搜索