当前位置: 首页 > news >正文

延吉网站建设depawo百度商家怎么入驻

延吉网站建设depawo,百度商家怎么入驻,联谊会建设网站,电商网站建设会计分录文章目录 C库ctypes基础数据类型参数与返回值类型数组指针结构体类型回调函数工具函数 示例 ctypes是Python的外部函数#xff0c;提供了与C兼容的类型#xff0c;并允许调用DLL库中的函数。 C库 要使函数能被Python调用#xff0c;需要编译为动态库#xff1a; # -fPIC… 文章目录 C库ctypes基础数据类型参数与返回值类型数组指针结构体类型回调函数工具函数 示例 ctypes是Python的外部函数提供了与C兼容的类型并允许调用DLL库中的函数。 C库 要使函数能被Python调用需要编译为动态库 # -fPIC使得位置独立 # -shared代表这是动态库 g -fPIC -shared -o libTest.so test.cpp为保证函数接口能被外部识别需要导出为纯C的 #ifdef __cplusplus extern C { #endifvoid * callForTest(char *params);#ifdef __cplusplus }; #endifctypes 在python中要使用DLL库需要先通过cdll来加载cdll载入按标准的 cdecl调用协议导出的函数 from ctypes import cdlltarget cdll.LoadLibrary(libTest.so)通过in_dll()可获取库中导出的变量 # 获取 Python 库本身的 Py_OptimizeFlag opt_flag c_int.in_dll(pythonapi, Py_OptimizeFlag)基础数据类型 ctypes 定义了一些和C兼容的基本数据类型所有基础类型都继承自ctypes._SimpleCData value属性包含实例的实际值。实例提取 value 属性时通常每次会返回一个新的对象。 ctypes 类型C 类型Python 类型c_bool_Boolbool (1)c_charchar1-character bytesc_wcharwchar_t1-character strc_bytecharintc_ubyteunsigned charintc_shortshortintc_ushortunsigned shortintc_intintintc_uintunsigned intintc_longlongintc_ulongunsigned longintc_longlong__int64 or long longintc_ulonglongunsigned __int64 or unsigned long longintc_size_tsize_tintc_ssize_tssize_t or Py_ssize_tintc_floatfloatfloatc_doubledoublefloatc_longdoublelong doublefloatc_char_pchar* (NUL terminated)bytes or Nonec_wchar_pwchar_t* (NUL terminated)str or Nonec_void_pvoid*int or None 除了整数、字符串以及字节串之外所有的Python类型都必须使用它们对应的ctypes类型包装才能够被正确地转换为所需的C语言类型。通过ctypes创建的类型是可变的通过修改.value i c_int() # i.value 0 i.value 99 # i.value 99c_wchar_p(Hello, World) # c.value Hello, World当给指针类型的对象c_char_p, c_wchar_p 和 c_void_p等赋值时将改变它们所指向的内存地址而不是它们所指向的内存区域的内容。若底层函数可能会改变指针地址则需要通过create_string_buffer创建 p create_string_buffer(3) # create a 3 byte buffer, initialized to NUL bytesp create_string_buffer(bHello) # create a buffer containing a NUL terminated stringp create_string_buffer(bHello, 10) # create a 10 byte buffer p.value bHi print(sizeof(p), repr(p.raw)) # 10 bHi\x00lo\x00\x00\x00\x00\x00参数与返回值类型 以libc库为例 cdll.LoadLibrary(libc.so.6)printf libc.printf # 通过设置argtypes属性来指定函数的必选参数类型 # 指定数据类型可以防止不合理的参数传递并且会自动尝试将参数转换为需要的类型否则必须手动转换 printf.argtypes [c_char_p, c_char_p, c_int, c_double] printf(bString %s, Int %d, Double %f\n, bHi, 10, 2.2)strchr libc.strchr # 默认返回int其他类型需通过restype属性来设定 strchr.restype c_char_p strchr.argtypes [c_char_p, c_char] strchr(babcdef, bd)# 构造缓冲区获取输出 i c_int() f c_float() s create_string_buffer(b\x00 * 32) # 创建长度32全部为NULL的缓冲区 libc.sscanf(b1 3.14 Hello, b%d %f %s, byref(i), byref(f), s) print(i.value, f.value, repr(s.value)) # 1 3.140000104904175 bHello数组 数组是一个序列包含指定个数元素且必须类型相同。创建数组类型的推荐方式是使用一个类型乘以一个正数: _length_属性指明数组中元素数量的正整数。_type_属性指明每个元素的类型。 class POINT(Structure):_fields_ (x, c_int), (y, c_int)pointsArray POINT * 5 print(sizeof(pointsArray)) # 40pa pointArray(POINT(1,2), POINT(3,4)) # 后面三个全为0 print(sizeof(pa), len(pa)) # 40 5 for i in pa: print(i.x, i.y, end;) # 1 2;3 4;0 0;0 0;0 0;指针 可以将ctypes类型数据传入pointer()函数创建指针 contents属性返回指针指向的真实对象 每次访问这个属性时都会构造返回一个新的相同对象_type_属性指明所指向的类型。指针对象也可以通过整数下标进行访问通过整数下标赋值可以改变指针所指向的真实内容无参调用指针类型可以创建一个NULL指针 i c_int(12) pi pointer(i) ic pi.contentsprint(ic, ic is i) # c_int(12) False# 通过下标访问与修改内容 pi[0]34 print(pi[0], pi.contents) # 34 c_int(34)# 修改指针指向 ii c_int(45) pi.contents ii print(pi[0]) # 56结构体类型 结构体必须通过子类化ctypes.Structure来创建并且至少要定义一个 _fields_类变量并允许通过直接属性访问来读取和写入字段。 _fields_属性定义结构体字段的序列。 其中的条目必须为2元组或3元组。 第一项是字段名称第二项指明字段类型可以是任何 ctypes 数据类型对于整数类型字段如c_int可以给定第三个可选项为定义字段比特位宽度的小正整数。 _pack_属性一个可选的小整数它允许覆盖实体中结构体字段的对齐方式。 对于不完整类型即在结构体中包含指向自身的指针 struct cell; /* forward declaration */struct cell {char *name;struct cell *next; };在python中不能在类中使用自身需要先定义结构然后在设定_fields_属性 class cell(Structure):passcell._fields_ [(name, c_char_p),(next, pointer(cell))]回调函数 必须先为回调函数创建一个类明确调用约定返回值类型以及参数信息CFUNCTYPE()工厂函数使用 cdecl 调用约定创建回调函数类型。 qsort libc.qsort qsort.restypeNone# 第一个参数为返回值类型后续一次为对应函数参数 CMPFun CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int)) def py_cmp_func(a,b):print(py_cmp_func, a[0], b[0])return 0cmp_fun CMPFun(py_cmp_func)IntArray5 c_int * 5 ia IntArray5(1, 9, 7, 5, 8) qsort(ia, len(ia), sizeof(c_int), py_cmp_func)注意回调函数是在Python之外的另外一个线程使用外部代码调用这个回调函数 ctypes 会在每一次调用时创建一个虚拟 Python 线程。这个行为在大多数情况下是合理的但也意味着如果有数据使用 threading.local 方式存储将无法访问就算它们是在同一个C线程中调用的。 工具函数 一些常用工具函数 ctypes.addressof(obj)以整数形式返回内存缓冲区地址obj 必须为一个 ctypes 类型的实例。ctypes.alignment(obj_or_type)返回一个 ctypes 类型的对齐要求obj_or_type 必须为一个 ctypes 类型或实例。ctypes.byref(obj[, offset])返回指向obj的引用该对象必须为一个 ctypes 类型的实例。 offset 默认值为零且必须为一个将被添加到内部指针值的整数。ctypes.cast(obj, type)类似于 C 的强制转换运算符。 它返回一个 type 的新实例该实例指向与 obj 相同的内存块。 type 必须为指针类型而 obj 必须为可以被作为指针来解读的对象。ctypes.create_string_buffer(init_or_size, sizeNone)创建一个可变的字符缓冲区。 返回的对象是一个 c_char 的 ctypes 数组。 init_or_size 必须是一个指明数组大小的整数或者是一个将被用来初始化数组条目的字节串对象。如果将一个字节串对象指定为第一个参数则将使缓冲区大小比其长度多一项以便数组的最后一项为一个 NUL 终结符。 可以传入一个整数作为第二个参数以允许在不使用字节串长度的情况下指定数组大小。 ctypes.create_unicode_buffer(init_or_size, sizeNone)创建一个可变的 unicode 字符缓冲区。ctypes.get_errno()返回调用线程中系统 errno 变量的 ctypes 私有副本的当前值。ctypes.memmove(dst, src, count)与标准 C memmove 库函数相同将 count 个字节从 src 拷贝到 dst。 dst 和 src 必须为整数或可被转换为指针的 ctypes 实例。ctypes.memset(dst, c, count)与标准 C memset 库函数相同将位于地址 dst 的内存块用 count 个字节的 c 值填充。 dst 必须为指定地址的整数或 ctypes 实例。ctypes.POINTER(type)创建并返回一个新的 ctypes 指针类型。 指针类型会被缓存并在内部重用因此重复调用此函数耗费不大。 type 必须为 ctypes 类型。ctypes.pointer(obj)创建一个新的指向 obj 的指针实例。 返回的对象类型为 POINTER(type(obj))。 如果你只是想向外部函数调用传递一个对象指针你应当使用更为快速的 byref(obj)。 ctypes.sizeof(obj_or_type)返回 ctypes 类型或实例的内存缓冲区以字节表示的大小。ctypes.string_at(address, size- 1)返回从内存地址 address 开始的以字节串表示的 C 字符串。 如果指定了 size则将其用作长度否则将假定字符串以零值结尾。ctypes.wstring_at(address, size- 1)返回从内存地址 address 开始的以字符串表示的宽字节字符串。 示例 以C回调一个python函数为例 C中的回调定义 #ifdef __cplusplus extern C { #endiftypedef void (*PrintOutput)(const char* outputs);void set_callback(PrintOutput func);#ifdef __cplusplus }; #endifpython中使用回调 from ctypes import cdll, c_char_p, CFUNCTYPE, POINTERtarget cdll.LoadLibrary(/workspace/libTest.so)PrintCallback CFUNCTYPE(None, c_char_p) def print_callback(outputs):print(outputs:, outputs)py_callback PrintCallback(print_callback)target.set_callback.restype None target.set_callback(py_callback)
http://www.pierceye.com/news/14680/

相关文章:

  • 网站开发需要资质吗游戏页面设计模板
  • 临沂网站建设联系方式接入网站备案要多久
  • 美观网站建设哪家好北京seo地址
  • 做外贸网站卖什么好自己怎么做优惠卷网站
  • 湖北省建设厅网站a群手机网页制作系统
  • 做网站推广的是什么职位商业信息发布平台
  • 响应式网站断点wordpress网站图片
  • 建网站得多少钱手机网站外链
  • 重视网站阵地建设公司网站建设费用账务处理
  • 高端建站网站网站建设与推广方案
  • 网站源码下载网翻墙在线代理
  • 可信赖的昆明网站建设wordpress5回复后查看
  • 网站空间关闭了怎么办网站开发 flex布局
  • 做宣传册网站近期新闻热点
  • 有没有做废品的网站中国芯片三巨头
  • 电子书下载网站建设html5制作网页的详细步骤
  • 公司网站友情链接网站后台做链接
  • asp建网站六安市 网站集约化建设
  • 网站建设的关键细节查看网站历史页面
  • 企业网站建设需要准备资料网站规划管理系统
  • 专业制作网站公司吗奢侈品网站建设方案
  • 房地产管理网站如何做链接
  • 网站制作在线版在线设计平台的优缺点
  • 国外修图教程网站沈阳网站开发制作
  • iis 浏览网站展厅设计企业
  • 网站访问慢 分析工具劳务派遣公司注册条件
  • 网站开发的分录怎么做物业管理
  • 西安网站建设价格wordpress主题图片消失
  • 海口网站建设就q479185700上墙wordpress 中文付费主题
  • jsp网站自身安全性通过什么技术实现263网易企业邮箱入口