我是靠谱客的博主 快乐小懒虫,最近开发中收集的这篇文章主要介绍python3 与ctypes,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚!


ctype库赋予了python类似于C语言一样的底层操作能力,同时又保有动态语言便捷的本性。

ctype模块使python能轻而易举的调用动态链接库中的导出函数。并可以构建复杂的C数据类型,并编写出具备底层内存操作能力的工具函数。

1.printf 与Hello world

# 基本信息和使用printf
from ctypes import *    #@UnusedWildImport
print(windll.kernel32)

msvcrt = cdll.msvcrt
print(msvcrt)

print(msvcrt.printf)
msg_str = b"Hello world!n"
msvcrt.printf(b"Testing: %s", msg_str)
# 强制刷新缓冲区,立即输出,
# 若无此句,会导致下面的python语句输出结束了才输出下面的字符串
msvcrt.fflush(0)
输出:

<WinDLL 'kernel32', handle 76a00000 at 1e23630>
<CDLL 'msvcrt', handle 76ae0000 at 1e0b710>
<_FuncPtr object at 0x01DECAF8>
Testing: Hello world!
2.构建并使用C 基本数据类型

# 构建并使用C 数据类型
i = c_int(9)
print(i)
print(i.value)

i.value = 1212;
print(i.value)

str_cp = c_char_p(b"learn python ctypes")
print(str_cp)
print(str_cp.value)

str_cp = c_wchar_p("hello python")
print(str_cp)
print(str_cp.value)
输出:

c_long(9)
9
1212
c_char_p(b'learn python ctypes')
b'learn python ctypes'
c_wchar_p('hello python')
hello python
3.按引用传参和使用scanf

# 按引用传参可以使用function(byref(parameter))
# byref(obj[, offset]) Returns a light-weight pointer to obj, 
# which must be an instance of a ctypes type. offset defaults to zero, 
# and must be an integer that will be added to the internal pointer value.
# byref(obj, offset) corresponds to this C code:
# (((char *)&obj) + offset)
# The returned object can only be used as a foreign function call parameter. 
# It behaves similar to pointer(obj), but the construction is a lot faster.
num = c_int()
print("input a int number:")
msvcrt.scanf(b"%d", byref(num))
print(num.value)
输入及输出:

input a int number:
123
123
4.使用python定义结构体和共用体

# 使用python 定义结构体与共用体
class color_rgb(Structure):
    _fields_ = [
                ('r', c_char),
                ('g', c_char),
                ('b', c_char),
                ]

color = color_rgb()
color.r = 123
color.g = 234
color.b = 222

print(ord(color.b))

color = color_rgb(111, 222, 121)
print(ord(color.b))


# 使用python 定义联合体
class barley(Union):
    _fields_ = [
                ("barley_long", c_long),
                ("barley_int", c_int),
                ("barley_char", c_char * 8)
                ]

val = input("Enter the amount of barley:")
bar = barley(int(val))
print(bar.barley_long, bar.barley_int, bar.barley_char)
输入和输出:

222
121
Enter the amount of barley:11111
11111 11111 b'g+'
注:11111转换成16进制为0x2B67,0x2B('+'),0x67('g'),按小端模式存放,故第三个输出为'g+'


最后

以上就是快乐小懒虫为你收集整理的python3 与ctypes的全部内容,希望文章能够帮你解决python3 与ctypes所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部