使用Visual Studio,几步实现Python C++扩展,以及DLL调用

在网上搜了下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

时间: 2024-11-06 18:50:06

使用Visual Studio,几步实现Python C++扩展,以及DLL调用的相关文章

用visual studio 2017来调试python

https://www.visualstudio.com/zh-hans/thank-you-downloading-visual-studio/?sku=Professional&rel=15 下载vs 然后安装 启动vs 建立项目,设置python环境,保存的项目就是xxxx.sin   每一次启动他 在项目里面加入python文件 写入代码,在左边加入断点. 在解决方案管理器里面右键.py文件开始执行 按这个按钮进行跳跃调试. 其中 这个按钮表示黄色这一行还没有运行.当前程序停在了这一行的

Visual studio 生成事件的使用 、xcopy 实现 dll 复制操作、

IF NOT "$(ConfigurationName)"=="publish" exit /B 0if not exist $(TargetPath)publish md $(TargetPath)publishxcopy /y $(TargetPath) $(SolutionDir)\\publisher 关于xcopy http://baike.baidu.com/link?url=PqKP2WNM02x4jWOGlYV4p2nm5X-gtIMitWsWMsI

Visual Studio上开发Python六大功能

一.整合 Python 直译器 (Interpreter) & 互动视窗 (Interactive) Visual Studio 高度整合 Python 直译器,让您能够在开发过程中切换不同版本的 Python 直译器.此项功能除了能够切换至您所熟悉的 Python 版本进行开发外,更可确保您的程序在不同 Python 版本下运行的函式相容性是合法的,如下图代码当中的 print 函式,在 Python 2.7 环境下为合法的 (红色箭头指向目前为使用 Python 2.7 全域环境直译器).

Python/C++ in Visual Studio: An Alternative to Matlab/MEX

来自Andrew Delong的博客 http://andrewdelong.wordpress.com/2012/11/03/pythonc-in-visual-studio-an-alternative-to-matlabmex/ I spent much of my PhD working in Matlab with C++ MEX extensions. Debugging MEX extensions is frustrating: either you resort to prin

visual studio code编辑python文件

visual studio code 安装.通过360软件管家,查找visual studio code 下载安装即可 设置visual studio code为中文 打开进入软件,Ctrl + Shift + P,切入到命令行模式.输入“Configure Language” 然后点击下拉框出来的 Configure Display Language 然后会出现如下界面,把"locale":"en"改成"locale":"zh-CN&

Visual Studio 2017 RC 下载 最新版本的发行说明

我们非常荣幸地宣布 Visual Studio 2017 RC 现已推出! 此新版本包括我们最新的功能创新和改进. 注意 这里是 Visual Studio 2017 最新版本的发行说明. 下载:Visual Studio Enterprise 2017 RC 若要了解有关其他相关下载的详细信息,请参阅下载页. 另请参阅 Visual Studio 2017 系统要求和 Visual Studio 2017 平台目标以及兼容性. 重要事项 虽然一般情况下支持在生产环境中使用 Visual Stu

.net转PHP从零开始-配置visual studio 2013 PHP开发环境php for visual studio

作为一个.net开发者,一直在visual studio这款强大的编辑器宠爱下,其他编辑器都不会用,也用着不熟练.最近这不是转php吗,使用php编辑器很不爽,觉得还是用visual studio舒服一些. 支持visual studio的插件有php tools for visual studio和vs.php,其中php tools for visual studio更是强大一些.但是是收费的,没办法,只好寻找破解方法. php tools for visual studio破解版下载地址:

Visual Studio解决方案的目录结构设置和管理

摘至:http://blog.csdn.net/lp310018931/article/details/47991759 首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系,假设新建一个项目ssyy,解决方案起名fangan,注意解决方案包括项 目,此时生成的最外层目录为fangan代表整个解决方案的内容都在这个文件夹内.在这个fangan文件夹内包含有fangan.sln的解决方案配置 文件和一个ssyy文件夹,ssyy

码住!Visual Studio扩展工具ReSharper安装指南来了

ReSharper是一个著名的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE.实质上,ReSharper特征可用于C#,VB.net,XML,Asp.net,XAML,和构建脚本. 使用ReSharper,你可以进行深度代码分析,智能代码协助,实时错误代码高亮显示,解决方案范围内代码分析,快速代码更正,一步完成代码格式化和清理,业界领先的自动代码重构,高级的集成单元测试方案,和强大的解决方案内导航和搜索. 安装指南 ReSharper是Visual St