ctypes笔记

作者:刘宾, thomas_liub@hotmail.com
请尊重作者著作权,转载请注明出处,谢谢!


类型表

ctype type C type python type
c_bool _Bool bool
c_char char 1-character bytes object
c_wchar wchar_t 1-character string
c_byte char int
c_ubyte unsigned char int
c_short short int
c_ushort unsigned short int
c_int int int
c_uint unsigned int int
c_long long int
c_ulong unsigned long int
c_longlong __int64 or long long int
c_ulonglong unsigned __int64 or unsigned long long int
c_size_t size_t int
c_ssize_t ssize_t or Py_ssize_t int
c_float float float
c_double double float
c_longdouble long double float
c_char_p char * (NUL terminated) bytes object or None
c_wchar_p wchar_t * (NUL terminated) string or None
c_void_p void * int or None

加载DLL

  1. 标准cdecl调用
dll = ctypes.CDLL("dllpath")
  1. Win dll
dll = ctypes.WinDLL("dllpath")

调用dll中方法

  1. 函数返回类型,函数默认返回c_int类型,如果需要返回其他类型,需要设置函数的restype属性
dll.method_in_dll.restype = ctypes.c_short
  1. 调用方法
ret = dll.method_in_dll()

数据类型转换

  • 指针
# 取对象指针
    ptr = ctypes.pointer(ct_obj)
    ptr.contents 为 ct_obj
# 初始化空指针
    ptr = ctypes.POINTER(ctypes.c_int)
# 字符串对象
    obj = c_wchar_p("Hello, World")
    obj
        c_wchar_p('Hello, World')
    obj.value
        u'Hello, World'
# 缓冲区
    # create a 3 byte buffer, initialized to NUL bytes
    p = create_string_buffer(3)
    # create a buffer containing a NUL terminated string
    p = create_string_buffer(b"Hello")
    # create a 10 byte buffer
    p = create_string_buffer(b"Hello", 10) 
  • 引用
ref = ctypes.byref(ct_obj)
  • 普通类型
i = c_int(42)
print i.value
  • 数组
buf = c_int * 10  
m = buf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print m[1]
  • 结构体和联合
class IODBPSD(ct.Structure):
    """ CNC parameter """
    class IODBDATA(ct.Union):
        class REALPRM(ct.Structure):
            _fields_ = [('prm_val', ct.c_long),
                        ('dec_val', ct.c_long)]
        _fields_ = [('cdata', ct.c_byte),
                    ('idata', ct.c_short),
                    ('ldata', ct.c_long),
                    ('rdata', REALPRM),
                    ('cdatas', ct.c_byte*f_globalv.MAX_AXIS),
                    ('idatas', ct.c_short*f_globalv.MAX_AXIS),
                    ('ldatas', ct.c_long*f_globalv.MAX_AXIS),
                    ('rdatas', REALPRM*f_globalv.MAX_AXIS)]
    _anonymous_ = ('u',)
    _fields_ = [('datano', ct.c_short),
                ('type', ct.c_short),
                ('u', IODBDATA)]
  • bitmap,仅对int有效
class Int(Structure):
    _fields_ = [("first_16", c_int, 16),
                ("second_16", c_int, 16)]
  • 链表
class Test(Structure):  
    pass  
Test._fields_ = [('x', c_int),  
                ('y', c_char),  
                ('next', POINTER(Test))]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前两天和一个认识很多年的朋友吃饭,说你今年怎么这么安生?以前你每年各种国家假期和年假都是往外跑的啊。我想了想,还真...
    shimashima阅读 3,564评论 0 2
  • “自欺欺人,有意思吗?”“没啊。”“那你还这样?”“起码留在纸上的一瞬间,一切的确没有发生过啊。”L妹子恋爱了,当...
    周青雨阅读 3,106评论 0 1
  • 窗外下着雨。 我在听课中,但心里一直有点忧虑。 我在维库买了两个课程,这几天有把如何做公众号听完。 ...
    青春的尾巴_2c4b阅读 2,166评论 0 0

友情链接更多精彩内容