ctypes: 可直接调用c语言动态链接库。
使用步骤:
1>编译好自己的动态连接库
2>利用ctypes载入动态连接库
3>用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图:
4>Python若想获取ctypes调用的C函数返回值,需要先指定返回值类型。我们将在接下来的完整Sample中看到如何使用。
#Step 1: test.c#include <stdio.h>int add(int a, int b)
{
return a + b
}#Step 2: 编译动态链接库 ( 如何编译动态链接库在本文不详解,网上资料一大堆。)gcc -fPIC -shared test.c -o libtest.so
#Step 3: test.py
from ctypes import *mylib = CDLL("libtest.so") 或者 cdll.LoadLibrary("libtest.so") add = mylib.add
add.argtypes = [c_int, c_int] # 参数类型,两个int(c_int是ctypes类型,见上表)
add.restype = c_int # 返回值类型,int (c_int 是ctypes类型,见上表)
sum = add(3, 6)
1.Windows x86 MSI Installer (2.7.8)
- 32位系统安装的python
2.Windows x86 MSI program database (2.7.8)
- 32位python源码的符号库。 如果做纯Python开发,为python的C接口开发准备的。
3.Windows X86-64 MSI Installer (2.7.8)
- 64位系统安装的python
4.Windows X86-64 MSI program database (2.7.8)
- 64位python源码的符号库。 如果做纯Python开发,为python的C接口开发准备的。
一. 基本概念
Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循 GPL(GNU General Public License)协议。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。
二. 优点
Python 是一种不受局限、跨平台的开源编程语言,它功能强大且简单易学。因而得到了广泛应用和支持。
ArcGIS 9.0 社区中引入了 Python。此后,Python 被视为可供地理处理用户选择的脚本语言并得以不断发展。每个版本都进一步增强了 Python 体验,从而为您提供更多的功能以及更丰富、更友好的 Python 体验。
ESRI 已将 Python 完全纳入 ArcGIS 中,并将其视为可满足我们用户社区需求的语言。下面仅介绍 Python 的部分优势:
1.易于学习,非常适合初学者,也特别适合专家使用。
2.可伸缩程度高,适于大型项目或小型的一次性程序(称为脚本)。
3.可移植,跨平台。
4.可嵌入(使 ArcGIS 可脚本化)。
5.稳定成熟。
6.用户社区规模大。
Python 已延伸到 ArcGIS 中,成为了一种用于进行数据分析、数据转换、数据管理和地图自动化的语言,因而有助于提高工作效率。
对于各种驱动接口,Python来编写测试用例的好处是:由于Python不需要编译,你所执行的也就是你所编写的,当发生异常的时候,你无须打开集成开发环境,加载测试工程、并调试,你能够很方便的看到python测试脚本的内容,什么地方出了异常可以立刻发现,例如:from ctypes import *
rc =c_int(-12345)
dll = windll.LoadLibrary("dmodbc.dll")#加载被测试组件
#=================#
SQLHANDLE_env = pointer(c_long(0))
SQLHANDLE_cnn = pointer(c_long(0))
SQLHANDLE_stmt = pointer(c_long(0))
pdns = c_char_p("FASTDB")
puid = c_char_p("SYSDBA")
ppwd = c_char_p("SYSDBA")
#env handle
rc = dll.SQLAllocHandle(1,None,byref(SQLHANDLE_env))
print "result of henv handle alloc :%d" %rc
#cnn handle
rc = dll.SQLAllocHandle(2,SQLHANDLE_env,byref(SQLHANDLE_cnn))
print "result of cnn handle alloc :%d" %rc
#connect!
rc = dll.SQLConnect(SQLHANDLE_cnn,pdns,-3,puid,-3,ppwd,-3)
print "result of connect :%d" %rc
#stmt handle
rc = dll.SQLAllocHandle(3,SQLHANDLE_cnn,byref(SQLHANDLE_stmt))
print "result of stmt handle alloc:%d" %rc
#exec
rc = dll.SQLExecDirect(SQLHANDLE_stmt,"insert into t values(1)",-3)
print "result of exec:%d" %rc
#free========================
rc = dll.SQLFreeHandle(3, SQLHANDLE_stmt)
print rc
rc = dll.SQLDisconnect(SQLHANDLE_cnn)
print rc
rc = dll.SQLFreeHandle(2, SQLHANDLE_cnn)
print rc
rc = dll.SQLFreeHandle(1, SQLHANDLE_env)
print rc
在上面我们可以看到,Python调用c/c++接口是十分容易的,只需要把动态库加载进来,然后把这个动态库当作一个对象实例来使用就可以了。下面将是一个使用ado.net接口的例子:
import System
from Dm import *#Dm是DMDBMS提供的ado.Net的DataProvider
#print dir(Dm.DmCommand)
i =0
cnn = Dm.DmConnection("server = 127.0.0.1User ID = SYSDBAPWD = SYSDBADatabase = SYSTEMport = 12345")
cmd = Dm.DmCommand()
cmd.Connection = cnn
cmd.CommandText = "insert into t values(1)"
cnn.Open()
i=cmd.ExecuteNonQuery()
print i
cmd.Dispose()
cnn.Close()
可以看到,.net对象的使用与在VisualStdio上进行开发几乎没有任何区别。
通过使用Python进行测试用例的开发,最大的好处莫过于:学习成本非常低,测试工程师只需要学习Python,对于其他语言稍有了解就可以了。同时只需要少量的测试开发工程师对Python测试框架进行维护。
这样的好处就是便于测试人员将精力专精在一个方向,免于“什么都会一点,但什么都不精”的情况。当然测试人员具备广阔的知识面,会使用各种常见的开发工具与平台是好事情,并且也是必要的,不过在短时间内要求迅速能够胜任大多数任务也是企业在人才培养上的期望目标。