浅谈 Python 程序和 C 程序的整合(2)

>>> from ctypes import * # 导入 ctypes 库中所有模块 >>> i = c_int(45) # 定义一个 int 型变量,值为 45 >>> i.value # 打印变量的值 45 >>> i.value = 56 # 改变该变量的值为 56 >>> i.value # 打印变量的新值 56

从下面的例子可以更明显地看出 ctypes 里的变量类型和 C 语言变量类型的相似性:

清单 2. ctypes 使用 C 语言变量

>>> p = create_string_buffer(10) # 定义一个可变字符串变量,长度为 10 >>> p.raw # 初始值是全 0,即 C 语言中的字符串结束符’ \0 ’ '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >>> p.value = "Student" # 字符串赋值 >>> p.raw # 后三个字符仍是’ \0 ’ 'Student\x00\x00\x00' >>> p.value = "Big" # 再次赋值 >>> p.raw # 只有前三个字符被修改,第四个字符被修改为’ \0 ’ 'Big\x00ent\x00\x00\x00'

下面例子说明了指针操作:

清单 3. ctypes 使用 C 语言指针

>>> i = c_int(999) # 定义 int 类型变量 i,值为 999 >>> pi = pointer(i) # 定义指针,指向变量 i >>> pi.contents # 打印指针所指的内容 c_long(999) >>> pi.contents = c_long(1000) # 通过指针改变变量 i 的值 >>> pi.contents # 打印指针所指的内容 c_long(1000)

下面例子说明了结构和数组的操作:

清单 4. ctypes 使用 C 语言数组和结构体

>>> class POINT(Structure): # 定义一个结构,内含两个成员变量 x,y,均为 int 型 ... _fields_ = [("x", c_int), ... ("y", c_int)] ... >>> point = POINT(2,5) # 定义一个 POINT 类型的变量,初始值为 x=2, y=5 >>> print point.x, point.y # 打印变量 2 5 >>> point = POINT(y=5) # 重新定义一个 POINT 类型变量,x 取默认值 >>> print point.x, point.y # 打印变量 0 5 >>> POINT_ARRAY = POINT * 3 # 定义 POINT_ARRAY 为 POINT 的数组类型 # 定义一个 POINT 数组,内含三个 POINT 变量 >>> pa = POINT_ARRAY(POINT(7, 7), POINT(8, 8), POINT(9, 9)) >>> for p in pa: print p.x, p.y # 打印 POINT 数组中每个成员的值 ... 7 7 8 8 9 9

Python 访问 C 语言 dll

通过 ctypes 模块,Python 程序可以访问 C 语言编译的 dll,本节通过一个简单的例子,Python 程序 helloworld.py 中调用 some.dll 中的 helloworld 函数,来介绍 Python 程序如何调用 windows 平台上的 dll。

导入动态链接库 清单 5. ctypes 导入 dll

from ctypes import windll # 首先导入 ctypes 模块的 windll 子模块 somelibc = windll.LoadLibrary(some.dll) # 使用 windll 模块的 LoadLibrary 导入动态链接库

访问动态链接库中的函数 清单 6. ctypes 使用 dll 中的函数

somelibc. helloworld() # 这样就可以得到 some.dll 的 helloworld 的返回值。

整个 helloworld.py 是这样的:

清单 7. Python hellpworld 代码

from ctypes import windll def callc(): # load the some.dll somelibc = windll.LoadLibrary(some.dll) print somelibc. helloworld() if __name__== “__main__”: callc()

在命令行运行 helloworld.py,在 console 上可以看到 some.dll 中 helloworld 的输出。

清单 8. Python hellpworld Windows command console 运行输出

C:\>python C:\python\test\helloworld.py Hello World! Just a simple test.

Python 调用 C 语言 so

通过 ctypes 模块,Python 程序也可以访问 C 语言编译的 so 文件。与 Python 调用 C 的 dll 的方法基本相同,本节通过一个简单的例子,Python 程序 helloworld.py 中调用 some.so 中的 helloworld 函数,来介绍 Python 程序如何调用 linux 平台上的 so。

导入动态链接库 清单 9. ctypes 导入 so

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ca2173bbfb7c710eafeb4d8736f308d6.html