栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

通过Ctypes从C到Python-将函数指针的结构包装为静态函数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通过Ctypes从C到Python-将函数指针的结构包装为静态函数

[Python 3.Docs]:ctypes-
Python的外部函数库
包含解决此问题所需的一切。

我相信缺少的主要部分是 ctypes 类型的 in_dll 方法( 访问从dll* 部分 导出的值 )。 __ *

除此之外,为了使用 C 数据,您需要让 Python 知道数据格式。这适用于:

  • 结构 s。通过子类定义 Python 副本
    ctypes.Structure
  • 函数指针(适用于您的情况)。使用定义它们
    ctypes.CFUNCTYPE

我准备了一个简化的示例来说明上述内容。请注意,为了简化操作,我没有进行任何错误处理(检查 NULL应该是 ))。

ch

struct Data {    int i;};typedef struct {    int (* const fn1) (struct Data*, const char*);} DataFn;extern DataFn const DATAFUNC;

抄送

#include <stdio.h>#include "c.h"static int func1(struct Data *pData, const char *source) {    printf("From C - Data.i: [%d], source: [%s]n", pData->i, source);    return -255;}DataFn const DATAFUNC = {&func1};

pre00.py

#!/usr/bin/env python3import sysfrom ctypes import c_int, c_char_p, Structure, CDLL, CFUNCTYPE, POINTER, byrefclass Data(Structure):    _fields_ = [        ("i", c_int),    ]fn1_type = CFUNCTYPE(c_int, POINTER(Data), c_char_p)class DataFn(Structure):    _fields_ = [        ("fn1", fn1_type),    ]def main():    data = Data(127)    dll = CDLL("./c.so")    data_func = DataFn.in_dll(dll, "DATAFUNC")    ret = data_func.fn1(byref(data), "abcd".enpre())    print("DATAFUNC.fn1 returned {:d}".format(ret))if __name__ == "__main__":    print("Python {:s} on {:s}n".format(sys.version, sys.platform))    main()

输出

[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> lsc.c  c.h  pre00.py[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> gcc

-shared -fPIC -o c.so c.c
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> ls
c.c c.h pre.py c.so
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> objdump
-t c.so | grep DATAFUNC
0000000000200e10 g O .data.rel.ro 0000000000000008
DATAFUNC
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049962265]> python3
pre00.py
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux

From C - Data.i: [127], source: [abcd]DATAFUNC.fn1 returned -255


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/626606.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号