一直对不同语言间的交互感兴趣,python和C语言又深有渊源,所以对python和c语言交互产生了兴趣。
公司主营业务:做网站、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出济宁免费做网站回馈大家。
最近了解了python提供的一个外部函数库 ctypes , 它提供了C语言兼容的几种数据类型,并且可以允许调用C编译好的库。
这里是阅读相关资料的一个记录,内容大部分来自 官方文档 。
ctypes 提供了一些原始的C语言兼容的数据类型,参见下表,其中第一列是在ctypes库中定义的变量类型,第二列是C语言定义的变量类型,第三列是Python语言在不使用ctypes时定义的变量类型。
创建简单的ctypes类型如下:
使用 .value 访问和改变值:
改变指针类型的变量值:
如果需要直接操作内存地址的数据类型:
下面的例子演示了使用C的数组和结构体:
创建指针实例
使用cast()类型转换
类似于C语言定义函数时,会先定义返回类型,然后具体实现再定义,当遇到下面这种情况时,也需要这么干:
可以简单地将"so"和"dll"理解成Linux和windows上动态链接库的指代,这里我们以Linux为例。注意,ctypes提供的接口会在不同系统上有出入,比如为了加载动态链接库, 在Linux上提供的是 cdll , 而在Windows上提供的是 windll 和 oledll 。
ctypes会寻找 _as_paramter_ 属性来用作调用函数的参数传入,这样就可以传入自己定义的类作为参数,示例如下:
用 argtypes 和 restype 来指定调用的函数返回类型。
这里我只是列出了 ctypes 最基础的部分,还有很多细节请参考官方文档。
这两天文章没有写,先是早出晚归出去玩了一整天,然后加班到凌晨3点左右,一天一篇计划划水得严重啊…
使用Python的ctypes,我们可以直接调用由C直接编译出来的函数。其实就是调用动态链接库中的函数。为什么我们需要这样做呢,因为有些时候,我们可能需要一个性能上比较讲究的算法,有些时候,我们可以在Python中使用已经有了的现成的被封闭在动态链接库中的函数。下面是如何调用的示例。
首先,我们用一个乘法来表示一个算法功能。下面是C的程序:
int multiply(int num1, int num2){
return num1 * num2;
}
如果在Windows下,你可能需要写成下面这个样子:
#include windows.h
BOOL APIENTRYDll
Main(HANDLE hModule, DWORD dwReason, LPVOID lpReserved){
return TRUE;
}
__declspec(dllexport)
intmultiply(int num1, int num2){
return num1 * num2;
}
然后,自然是把这个C文件编成动态链接库:
Linux下的编译:
gcc -c -fPIC libtest.c
gcc -shared libtest.o -o libtest.so
Windows下的编译:
cl -LD libtest.c -libtest.dll
于是在我们的Python中可以这样使用:
(其中的libtest.so在Windows下改成libtest.dll即可)
from ctypes import *
import os
libtest = cdll.LoadLibrary(os.getcwd() + '/libtest.so')
print libtest.multiply(2, 2)4
注意:上面的Python脚本中需要把动态链接库放到当前目录中。
CAST函数的用法:
1、CAST 函数 [数据类型转换]
2、功能:
返回转换为提供的数据类型的表达式的值。
3、语法:
CAST(expression AS data type)
4、参数:
expression 要转换的表达式
data type 目标数据类型
5、用法:
如果未指定字符串类型的长度,数据库服务器将选择适当的长度。如果没有为十进制转换指定精度和小数位数,则数据库服务器将选择适当的值。
6、示例:
下面的函数确保字符串被用作日期:
SELECT CAST( '2000-10-31' AS DATE )
计算表达式 DE1 + 2DE 的值,并将结果转换为单字符字符串。
SELECT CAST( 1 + 2 AS CHAR )
可以使用 CAST 函数缩短字符串:
SELECT CAST( 'Surname' AS CHAR(5) )
decimal(20,2)
decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal 数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值。其中20是小数点左边和右边的数字个数之和(不包括小数点),2代表小数点右边的小数位数或数字个数。decimal(20,2)可以存储18位整数2位小数的数字。
convert(decimal(20,2), 成人标准)
class stdata(Structure):
_fields_ = [('pBuf', c_char_p), ('buflen', c_int)]
N=100
buf = create_string_buffer(N)
d = stdata()
d.buflen = N
d.pBuf = cast(buf, c_char_p)
n = CallMyCFunc_GetData(byref(d))
关键在于create_string_buffer创建可写buffer;cast转换为char*类型。
如果SQL Server程序员想将表达式从一种换为另一种,他可以从SQL Server 7和2000中自带的两种功能中做出选择。在存储过程或其他情况下,我们常常需要将数据从datetime型转化成varchar型;CONVERT和CAST就可以用于这种情况。
由于SQL Server提供两种功能,因此应该选择哪种功能或应该在哪种情况下使用该功能就很容易让人困惑了。CONVERT是专对SQL Server使用的,使日期与时间值,小数之间转换具有更宽的灵活性。
CAST是两种功能中更具ANSI标准的功能,即虽然更具便携性(比如,使用CAST的函数能更容易的被其它数据库软件使用),但功能相对弱一些。不过,当小数转化为数值,并保留原始表达式中的小数数值时,仍然需要使用CAST。因此,我建议首先使用CAST,如果遇到必须使用CONVERT的情况时再使用CONVERT。
CAST和CONVERT还能联合使用,达到特殊的效果。比如,在current date下生成char变量一般使用以下方法:
SELECT CONVERT(CHAR(10), CURRENT_TIMESTAMP, 102)
(102表明使用了ANSI日期模式,即yy.mm.dd型)
然而,如果你希望将这个变量明确生成为datetime或smalldatetime变量,以此在特定的数据库栏中兼容,那么你可以使用以下语句:
SELECT CAST(CONVERT(CHAR(10),CURRENT_TIMESTAMP,102) AS DATETIME
返回值将是 yy.mm.dd 00:00:00(如12:00AM作为时间戳;
SQL Server Date 函数
定义和用法
DATEADD() 函数在日期中添加或减去指定的时间间隔。
语法
DATEADD(datepart,number,date)date 参数是合法的日期表达式。number 是您希望添加的间隔数;对于未来的时间,此数是正数,对于过去的时间,此数是负数。
datepart 参数可以是下列的值:
datepart 缩写
年 yy, yyyy
季度 qq, q
月 mm, m
年中的日 dy, y
日 dd, d
周 wk, ww
星期 dw, w
小时 hh
分钟 mi, n
秒 ss, s
毫秒 ms
微妙 mcs
纳秒 ns