概述
注:以下内容为学习笔记,多数是从书本、资料中得来,只为加深印象,及日后参考。然而本人表达能力较差,写的不好。因非翻译、非转载,只好选原创,但多数乃摘抄,实为惭愧。但若能帮助一二访客,幸甚!
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复