• Python ctypes 在 Python 2 和 Python 3 中的不同 // 使用ctypes过程中问题汇总


    In Python 2.7, strings are byte-strings by default. In Python 3.x, they are unicode by default. Try explicitly making your string a byte string using .encode('ascii') before handing it to DLL.prepare.

    ==>在Python 2.7中,string默认的是byte-strings,而在 Python 3.x中默认的是unicode。因此在3.x中将string传入到调用的DLL之前先使用 .encode('ascii') 将其变成 byte string类型

    以下两种方法都能实现  unicode == > byte-strings

    >>> a = "hhk"
    >>> b = bytes(str(a),'ascii')
    >>> b
    b'hhk'
    >>> c = str(a).encode('ascii')
    >>> c
    b'hhk'

    print(type(a) , type(b) , type(c))
    <class 'str'> <class 'bytes'> <class 'bytes'>

    可阅读的参考文章 :

    “Python3中byte与string的相互转换”   : http://www.cnblogs.com/txw1958/archive/2012/08/31/python3-bytes-string.html

     

    1.

    c_int()含有属性value,取其value变为python的int类型数据
    >>> from ctypes import *
    >>> a = c_int(10)
    >>> type(a)
    <class 'ctypes.c_long'>
    >>> b = a.value
    >>> b
    10
    >>> type(b)
    <class 'int'>

    2.

    Python代码中进行比较时,比较的参数一定要全部都是python数据类型,ctypes的数据类型是不能比较的
    (python的int类型与ctypes中的c_int类型比较的bool值是False,ctypes中的c_int类型与c_int类型比较的bool值是False)
    >>> c = 5
    >>> d = c_int(5)
    >>> c == d
    False
    >>> e = d.value
    >>> c == e
    True
    >>> a = c_int(5)
    >>> b = c_int(5)
    >>> a == b
    False

    (ctypes中的c_char_p类型与c_char_p类型比较的bool值是False)
    >>> a = c_char_p(b"aaa")
    >>> b = c_char_p(b"aaa")
    >>> a == b
    False
    >>> a.value == b.value
    True
    >>> bool(a)
    True
    >>> a = c_char_p()
    >>> bool(a)
    False

    3.

    c_char_p()含有属性value,取其value变为bytes object,再取其decode()属性变为python的str类型数据,python的str类型有encode属性,通过encode属性,变成bytes object类型
    >>> a="hhk"
    >>> type(a)
    <class 'str'>
    >>> b=c_char_p(b"hhk")
    >>> type(b)             b有value属性
    <class 'ctypes.c_char_p'>
    >>> c=b.value
    >>> c                    bytes object类型,有decode属性
    b'hhk'
    >>> type(c)
    <class 'bytes'>
    >>> d=b.value.decode()         通过decode属性,变成python的str类型
    >>> d
    'hhk'
    >>> type(d)
    <class 'str'>

    >>> b = "hhk"             b有encode属性
    >>> c = b.encode()             通过encode属性,变成bytes object类型
    >>> c
    b'hhk'
    >>> type(c)
    <class 'bytes'>

    4.

    数字类型的比较:

    >>> c = 5
    >>> d = c_int(5)
    >>> c == d
    False
    >>> e = d.value
    >>> c == e
    True

    字符串类型的比较:
    >>> str1 = "hhk"
    >>> str2 = "hhk"
    >>> str1 == str2
    True

    5.

    判断c_char_p类型字符串是否为空,使用 if(a)
    >>> a = c_char_p()
    >>> bool(a)
    False
    >>> a = c_char_p(b"hhk")
    >>> bool(a)
    True

    判断string类型字符串是否为空,使用 if(a)
    >>> a=""
    >>> bool(a==None)
    False
    >>> bool(a)
    False

    判断列表是否为空,使用 if(list)
    >>> list = []
    >>> bool(list)
    False
    >>> not list OK
    True
    >>> list == None ERROR
    False

    判断bool值的真假
    --ctypes中的任何类型都不能和python中的类型直接比较
    >>> a = c_bool(0)
    >>> a
    c_bool(False)
    >>> type(a)
    <class 'ctypes.c_bool'>
    >>> a==0
    False
    >>> a==False
    False
    >>> a.value == 0
    True
    >>> b = a.value
    >>> type(b)
    <class 'bool'>
    >>> b
    False
    >>> b == 0
    True

    6.

    判断定义的一个实体对象是否为空
    rt = hostid_t()
    bool(rt) ==>False
    bool(rt == None) ==>False
    bool(rt.platform) ==>False
    我采用的方法是判断实体对象元素是否为空
    if rt.platform == None
    if rt.platform

    7.

    Calling the pointer type without an argument creates a NULL pointer. NULL pointers have a False boolean value

    == > 当调用POINTER类型没有传入参数时,将创建一个空指针,空指针将会有一个错误的boolean值
    >>> null_ptr = POINTER(c_int)()
    >>> print (bool(null_ptr))
    False

    >>> c_int_p = POINTER(c_int)
    >>> null_ptr = c_int_p()
    >>> print(bool(null_ptr))
    False

    //Python 官网实例:

    >>> PI = POINTER(c_int)
    >>> PI
    <class 'ctypes.LP_c_long'>
    >>> PI(42)
    Traceback (most recent call last):
    File "<stdin>", line 1, in ?
    TypeError: expected c_long instead of int
    >>> PI(c_int(42))
    <ctypes.LP_c_long object at 0x...>

  • 相关阅读:
    1+x LNMP + WordPress
    1+X Samba
    1+X NFS
    1+x FTP
    1+x LVM
    笔记(全)
    前端性能优化整理总结
    Event Loop我知道,宏任务微任务是什么鬼?
    深入探讨深拷贝浅拷贝两兄弟
    react后台管理系统路由方案及react-router原理解析
  • 原文地址:https://www.cnblogs.com/fendou-999/p/3534930.html
Copyright © 2020-2023  润新知