龙空技术网

使用python测试c++动态链接库

诗泽园 228

前言:

当前我们对“python生成动态库”大致比较关注,同学们都需要学习一些“python生成动态库”的相关资讯。那么小编同时在网摘上收集了一些有关“python生成动态库””的相关文章,希望我们能喜欢,我们快快来了解一下吧!

以下内容来自公众号:诗泽园

目标:

c++动态链接库测试时,若使用c++语言编写测试程序,成本较高,是否能快速生成python调用接口呢,本文旨在介绍swig工具的使用,让你掌握接口的c++api接口的封装,便于上层测试。其他方法还有cffi、boost python等; 此外也可以利用 python 完成c++函数的单元测试。

步骤:

1、编写 接口文件data.i

%module(directors="1") datasolution%{   #include "ServerApi.h"   #include "BusPackage.h"   #include "OpenBusApiStru.h"%}%feature("director") CServerApiSpi;%include "BusStruct.h"%include "OpenBusApiStru.h"%include "ServerApi.h"%include "BusPackage.h"

2、调用swig 生成python跟c++wrapper

swig -threads -c++ -python "D:\Program Files\datasolution\data.i"

3、生成文件目录结构如下

datasolution.pydata_wrap.hdata_wrap.cxx

4、生成python接口文件如下

# This file was automatically generated by SWIG ().# Version 3.0.10## Do not make changes to this file unless you know what you are doing--modify# the SWIG interface file instead.from sys import version_info as _swig_python_version_infoif _swig_python_version_info >= (2, 7, 0):    def swig_import_helper():        import importlib        pkg = __name__.rpartition('.')[0]        mname = '.'.join((pkg, '_datasolution')).lstrip('.')        try:            return importlib.import_module(mname)        except ImportError:            return importlib.import_module('_datasolution')    _datasolution = swig_import_helper()    del swig_import_helperelif _swig_python_version_info >= (2, 6, 0):    def swig_import_helper():        from os.path import dirname        import imp        fp = None        try:            fp, pathname, description = imp.find_module('_datasolution', [dirname(__file__)])        except ImportError:            import _datasolution            return _datasolution        if fp is not None:            try:                _mod = imp.load_module('_datasolution', fp, pathname, description)            finally:                fp.close()            return _mod    _datasolution = swig_import_helper()

5、创建c++项目生成datasolution.dll 重命名为_datasolution.pyd 1.新建一个空的dll项目 2.导入头文件与cxx文件 3.项目引入python\include目录及链接器导入lib 在c++工程中添加现有项,将这些文件全部添加到工程中去。下面还要做几步:1.将你安装的python下include文件夹的路径添加至C++附加包含目录。我的路径是C:\Python27\include;,C++附加包含目录在工程-属性-配置属性-c/c++处。 2.将你安装的python中python27.lib添加至工程附加依赖项中。我的lib路径是C:\Python27\libs\python27.lib;,附加依赖项在工程-属性-配置属性-链接器-输入处。

这样全部完成之后,选择Release版本,我们按F7编译,在_datasolution\Release目录底下可见datasolution.dll动态库文件,说明编译成功,将其重命名为datasolution.pyd,这样_datasolution Python API就编译成功了。 6、编写测试程序

#coding:utf-8import datasolution as dsapiclass CApiSpi(dsapi.CServerApiSpi):    def OnRcvReq(self, nReqID, pCondition, nLength, nSeqNO):            print  nReqID            print pCondition            print nLength            print nSeqNOcsapi=dsapi.CServerApi()errormsg=dsapi.ERROR_INFO()csapi.Init(errormsg)errormsg=dsapi.ERROR_INFO()csapi.Connect("172.28.10.25", 2008, errormsg)print errormsg.nErrIDprint errormsg.strErrMsgerrormsg=dsapi.ERROR_INFO()csapi.AddService(2689, errormsg)print errormsg.nErrIDprint errormsg.strErrMsgerrormsg=dsapi.ERROR_INFO()loginReq=dsapi.CFFEX_IN_OUT_MONEY()loginReq.ACCOUNTID='801000849'loginReq.AMOUNT=0.05loginReq.BROKERID='0125'loginReq.CURRENCY='USD'loginReq.SECONDSERIALNO='00000012222'#loginReq['nEventHandle'] = 100000001'''{"BrokerID", STRING_TYPE_S},{"AccountID", STRING_TYPE_S},{"Currency", STRING_TYPE_S},{"Amount", DOUBLE_TYPE_S},{"AmountDirection", CHAR_TYPE_S},{"SerialNo", STRING_TYPE_S},{"Date", STRING_TYPE_S},{"Time", STRING_TYPE_S}'''# reqid = reqid + 1                       # 请求数必须保持唯一性print csapi.Request(5002,loginReq,1000, errormsg)cpack=csapi.CreatePackage()

作者:lion (rywu),某科技公司测试专家

主页:

以上内容来自公众号:诗泽园

标签: #python生成动态库 #python 调用动态链接库 #python动态链接库在哪里